2017-08-09 85 views
1

一般來說,我想從底部處理我的名單了倒車for循環:在一定的條件下

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

有時我想從上往下做:

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

是有一種方法可以在單行代碼中表達這一點?

+2

你可以使用'array_reverse'。例如'foreach($ reverse?array_reverse($ products):$ products)as $ product)' –

+1

您可以在循環前初始化'$ dp',並執行類似'for(; $ reverse?$ dp < ... : $dp > = 0; $ dp + = $ reverse?1:-1)'...雖然這不是非常可讀的。也許寧可將循環體放入一個函數中,然後執行兩個不同的循環來調用該函數。 – deceze

回答

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

,或者如果的$dp值是什麼在循環體中重要的是,改變計數器和計算它:

​​
+0

有趣的想法,但我需要$ dp在數組的塊作爲索引。儘管如此,使用你的方法我可以計算索引並將其放入一個新變量中。 –

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; 
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.

+1

巧妙的解決方案。 – BeetleJuice