Эффективное использование foreach в PHP - PullRequest
3 голосов
/ 01 февраля 2012

Так что я не думаю, что в полной мере использую цикл foreach.Вот как я понимаю foreach.

  • Это похоже на foreach (arrayyouwanttoloopthrough как onevalueofthatarray)

  • Счетчик или приращение не требуются, он автоматически вытягиваетмассив, значение за значением в каждом цикле, и для этого цикла он вызывает значение, которое следует после «как».

  • Останавливается, как только это будет сделано с массивом.

  • Должно, в основном, заменить «for», при условии работы с массивом.

Так что я пытаюсь многое сделать с foreach, это изменить значения массива вциклический массив.Но в конце я продолжаю находить, что мне нужно использовать цикл for для такого типа вещей.

Итак, допустим, у меня есть массив (thing1, thing2, thing3, thing4), и я хотел его изменить.... скажем всем "BLAH", с числом в конце, я бы сделал

$counter = 0;
foreach($array as $changeval){
$counter++;
$changeval = "BLAH".$counter;
}

Я бы подумал, что это изменит его, потому что $ changeval должен быть любым значением, которое он имеет для массива, право?Но это не так.Единственный способ, который я мог бы найти для этого в a] foreach, - это установить счетчик (как выше) и использовать массив с индексом счетчика.Но чтобы сделать это, я должен установить счетчик за пределами цикла, и это даже не всегда надежно.Для этого я думаю, что было бы лучше использовать цикл for вместо foreach.

Так зачем вам использовать foreach over for?Я думаю, что чего-то здесь не хватает, потому что foreach ДОЛЖЕН иметь возможность изменять значения ...

Спасибо

О, ЭЙ. Еще одна вещь.Доступны ли переменные в циклах (например, i или key) вне цикла?Если бы у меня было 2 цикла foreach, таких как

foreach (вещь как значение)

, мне пришлось бы сделать второй

foreach (вещь2 как значение2)]

или иначе возникнут проблемы?

Ответы [ 5 ]

6 голосов
/ 01 февраля 2012

Вместо этого вы можете использовать ссылочную переменную:

foreach ($array as &$value)
{
    $value = "foo";
}

Теперь массив заполнен foo (обратите внимание на & перед $value).

Как правило,переменная цикла просто содержит копию соответствующего элемента массива, но & (амперсанд) говорит PHP сделать его ссылкой на фактический элемент массива, а не просто на копию;следовательно, вы можете изменить его.

Однако, как говорит @Tadeck ниже, в этом случае вы должны быть осторожны, чтобы уничтожить ссылку после завершения цикла, так как $value все равно будет указывать на последний элемент вмассив (так что можно случайно изменить его).Сделайте это с unset:

unset($value);

Другой вариант - использовать синтаксис $key => $value:

foreach ($array as $key => $value)
{
    $array[$key] = "foo";
}

. Чтобы ответить на второй вопрос:да, они впоследствии доступны вне цикла, поэтому рекомендуется использовать unset при использовании переменных ссылочного цикла, как в моем первом примере.Однако нет необходимости использовать новые имена переменных в последующих циклах, поскольку старые будут просто перезаписаны (без нежелательных последствий).

2 голосов
/ 01 февраля 2012

Вы хотите перейти по ссылке:

$arr = array(1, 2, 3, 4);

foreach ($arr as &$value)
{
    $value = $value * 2;
}

// $arr is now array(2, 4, 6, 8)
0 голосов
/ 01 февраля 2012

Вы можете использовать ключ при цикле с foreach:

foreach ($array as $key => $value)
{
    $array[$key] = "foo";
}

Но учтите, что при использовании ссылки типа будет предложено будет быстрее для такого случая - но в любом случае, $key => $value -синтаксис иногда бывает полезен.

0 голосов
/ 01 февраля 2012

Увеличение от 0 до ...

foreach($array as $changeval){
  if (!isset($counter)) { $counter = 0; }
  $counter++;
  $changeval = "BLAH".$counter;
}

Использование индекса / ключа ARRAY

foreach($array as $key => $changeval){
  $changeval = "BLAH".$key;
}
0 голосов
/ 01 февраля 2012

Расширенный синтаксис foreach выглядит следующим образом:

foreach ($array as $key => $value) {
}

Используя $key, вы можете проиндексировать исходный массив:

foreach ($array as $key => $value) {
    $array[$key] = "BLAH";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...