在某些条件下反转循环

时间:2017-08-09 20:17:19

标签: php arrays loops

一般来说,我想从下往上处理我的列表:

for ($dp = sizeof($products) - 1; $dp >= 0; $dp--) {

有时候我想从上到下做这件事:

for ($dp = 0; $dp < sizeof($products); $dp++) {

有没有办法在一行代码中表达这一点?

3 个答案:

答案 0 :(得分:2)

for ($dp = 0; $dp < sizeof($array); $dp++) {
    $item = $array[$reversed ? sizeof($array) - $dp - 1 : $dp];
}

或者,如果$dp的值在循环体中是重要的,请更改计数器并计算它:

for ($pos = sizeof($products) - 1; $pos >= 0; $pos--) {
   if (!$reversed) {
       $dp = $pos;
   } else {
       $dp = sizeof($products) - $pos - 1;
   }

答案 1 :(得分:2)

定义一个能够在所需方向上产生值的函数:

function iterate($iterable, $forward = true) {
    $init = $forward ? 'reset' : 'end';
    $next = $forward ? 'next'  : 'prev';
    for ($init($iterable); ($key=key($iterable))!==null; $next($iterable)){
        yield $key => current($iterable);
    }
}

然后使用它:

$array = [ 'q', 'l', 'z' ];

// forward...
foreach (iterate($array) as $key => $value) {
    echo "$key => $value" . PHP_EOL;
}

// now backward...       VVVVV
foreach (iterate($array, false) as $key => $value) {
    echo "$key => $value" . PHP_EOL;
}

这种方法可以使您免受与索引杂耍相关的错误的影响。

See it online at 3v4l.org.

答案 2 :(得分:1)

// first determine direction of traversal and
// initialize your $dp index at the appropriate end of $array
$step = $someCondition? 1 : -1;
$dp = $step > 0 ? 0 : sizeof($array)-1;

//use a while loop    
while($dp < sizeof($array) && $dp >=0 && !empty($array) ):
   $item = $array[$dp];
   $dp += $step;
endwhile;