【发布时间】:2017-08-04 20:06:09
【问题描述】:
TL;DR
如何对数组进行切片以在给定偏移量(也是用户定义)之前和之后获取(用户定义的)条目数而不会超出范围。例如:
$collection = [ 'A', 'B', 'C', 'D', 'E' ];
如果定义了 2 的限制和索引 3 (D) 的起始偏移量,则例程应返回 B、C、D、E:D 之前有两个,@ 之后只有一个987654328@,否则会超出范围。
如果定义了 3 的限制和索引 0 (A) 的起始偏移量,则例程应返回 A、B、C、D,在 A 之后返回三个,在它之前没有返回,否则也会超出范围。
切片必须扩展以始终在
$offset找到的条目之前和之后带来$limit定义的元素数量。当然,除非其中一方超出范围
我正在尝试找出一种简单的(可能是唯一的数学方法)来获取索引(并且当前是顺序)数组的偏移邻居,但具有自定义限制。
我想到的第一件事就是使用array_slice():
$collection = range( 'A', 'Z' );
$offset = 0; //rand( 0, 25 );
$limit = 3;
$length = count( $collection );
if( $offset >= $length ) {
throw new \OutOfRangeException( 'Requested offset exceeds the size of Collection' );
}
$start = ( $offset - $limit ) >= 0 ? ( $offset - $limit ) : 0;
$end = $limit + 2;
$slice = array_slice( $collection, $start, $end );
根据我的测试,$start 工作正常。我正在强制第一个偏移量来避免负值。
然后我首先认为我可以将$limit 增加 2 以获得“第二个偏移量”,当然它不起作用,但那是我的错。我不经常使用那个功能>.
然后我把$end的逻辑改成:
$end = $offset + $limit + 1;
我在集合中找到的偏移量,加上限制和另外一个以包含存储在$offset 中的条目。在 $offset 设置为 4 (E) 或更多之前,它运行良好。之后,对于字母“F”,切片上升到 G,H 上升到 I,依此类推 o.O
我试图寻找解决方案,但到目前为止我能找到的是涉及循环和复杂条件。据我所知,我不应该需要它,毕竟如果它是连续的,我可以对其应用“简单”数学。
但是我的没用,所以我可能错了......
【问题讨论】:
-
你想做什么?一个都看不懂
-
我已经用问题的更总结版本编辑了问题
-
第一个例子你取D,那为什么不取第二个例子A呢?
-
@procras 你写的似乎是正确的。在第一个例子中,起始位置在数组中,在第二个例子中它被省略了。哪个是正确的?
-
你的意思是在我删除我的尝试(上半部分)的修订之前还是之后。因为我多次检查了我在短版中写的 3 次,据我所知是正确的