一般來說,我想從底部處理我的名單了倒車for循環:在一定的條件下
for ($dp = sizeof($products) - 1; $dp >= 0; $dp--) {
但有時我想從上往下做:
for ($dp = 0; $dp < sizeof($products); $dp++) {
是有一種方法可以在單行代碼中表達這一點?
一般來說,我想從底部處理我的名單了倒車for循環:在一定的條件下
for ($dp = sizeof($products) - 1; $dp >= 0; $dp--) {
但有時我想從上往下做:
for ($dp = 0; $dp < sizeof($products); $dp++) {
是有一種方法可以在單行代碼中表達這一點?
for ($dp = 0; $dp < sizeof($array); $dp++) {
$item = $array[$reversed ? sizeof($array) - $dp - 1 : $dp];
}
,或者如果的$dp
值是什麼在循環體中重要的是,改變計數器和計算它:
有趣的想法,但我需要$ dp在數組的塊作爲索引。儘管如此,使用你的方法我可以計算索引並將其放入一個新變量中。 –
// 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;
定義自己,得到的值的函數期望的方向:
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;
}
此方法使您免於與索引雜耍相關的錯誤。
巧妙的解決方案。 – BeetleJuice
你可以使用'array_reverse'。例如'foreach($ reverse?array_reverse($ products):$ products)as $ product)' –
您可以在循環前初始化'$ dp',並執行類似'for(; $ reverse?$ dp < ... : $dp > = 0; $ dp + = $ reverse?1:-1)'...雖然這不是非常可讀的。也許寧可將循環體放入一個函數中,然後執行兩個不同的循環來調用該函數。 – deceze