一般来说,我想从下往上处理我的列表:
for ($dp = sizeof($products) - 1; $dp >= 0; $dp--) {
但有时候我想从上到下做这件事:
for ($dp = 0; $dp < sizeof($products); $dp++) {
有没有办法在一行代码中表达这一点?
答案 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;
}
这种方法可以使您免受与索引杂耍相关的错误的影响。
答案 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;