2009-05-28 3 views
1

Есть ли способ итерации по массиву, но выполнение операции для каждого другого элемента? ie Если у меня есть массив из 13 элементов, как мне сделать что-то только для элементов 2,4,6,8,10 и 12?выборочная итерация массива в php

ответ

0

исправить cletuses ответить на более высокой скорости и исправить опечатки:

for ($i = 1, $j = count($array); $i < $j; $i += 2) { 
    // code 
} 
+0

Узнал что-то из этого, я не знал, что вы могли бы назначить несколько переменных в первом выражении (или последующих). Благодаря! –

+2

Скорость? В лучшем случае «кеширование» размера массива - это микро-оптимизация. Это также семантически эквивалентно. Что делать, если размер массива изменяется во время цикла? – cletus

+0

@phil, np. рад помочь :) @cletus, если ваш массив изменяется во время цикла, вы должны использовать foreach или update $ j в цикле. Это оптимизация скорости и действительная. Представьте себе массив из 1000000 значений, тогда вы увидите, что я имею в виду. – Ozzy

1
for ($i=1; $i<sizeof($array); $i+=2) { 
    // do stuff to $array[$i] 
} 

Вы можете интегрировать его в петлю Еогеасп тоже:

$i = 0; 
foreach ($array as $v) { 
    if ($i++ & 1) continue; 
    // do stuff to $v 
} 

Примечание:$i & 1 эквивалентно ($i % 2) == 1 (или просто $i % 2).

+0

Должна ли последняя часть утверждения быть равна $ i + = 2? – musoNic80

+0

Не уверен, что я получу пример foreach. Не могли бы вы объяснить это мне немного проще ?! – musoNic80

+1

В основном цикл foreach(), в отличие от обычного цикла for(), не имеет индексного счетчика, поэтому $ i используется как суррогатный индекс. Он увеличивается на каждую итерацию. $ i & 1 вернет true для значений 1, 3, 5, 7. Он начинается с 0, поэтому он возвращает true для каждого второго элемента (что означает пропустить их). – cletus

3
foreach($array as $val) { 
    if(($i++ % 2) == 0) { 
    ...do stuff here... 
    } 
} 
+0

Вот как бы я это сделал, ну, кроме брекетов. Логика мертва проста, и это отражает это хорошо, плюс это упрощает расширение с помощью else без перезаписи логики цикла. – Kris

+0

Ответы велики, спасибо. Могу ли я добавить пример реального мира? У меня есть массив, который имеет 2 элемента для каждого дня недели. (Нумерация начинается с 0). Мне нужен цикл, который будет делать что-то в каждый ДЕНЬ не для каждого элемента. Как я могу использовать ответы, которые вы дали, чтобы достичь этого? PS Там еще нет кода для публикации, я просто пытаюсь его выработать первым !!! – musoNic80

+0

, если ваш массив тоже похож $ array = array ('mon1', 'mon2', 'tue1', 'tue2' ... 'fri2'); и всегда следует за отдельным шаблоном, тогда вы можете использовать этот код, как написано. Если вы хотите удостовериться, что он поражает каждый день, вам нужно как-то его проверить. Трудно сказать, не зная, что происходит, и чего вы хотите. –

0

Еще одна вариация на ответы уже вывешенные ... Похоже на ответ Фила Картера. Если массив имеет числовой индекс, вы можете использовать его в foreach вместо управления отдельной переменной счетчика:

foreach ($array as $i => $v) { 
    if (! ($i % 2)) { 
    // do stuff to $v 
} 
Смежные вопросы