Мое личное мнение - использовать то, что имеет смысл в контексте. Лично я почти никогда не использую for
для обхода массива. Я использую его для других типов итерации, но foreach
слишком просто ... В большинстве случаев разница во времени будет минимальной.
Главное, на что нужно обратить внимание:
for ($i = 0; $i < count($array); $i++) {
Это дорогой цикл, так как он вызывает количество вызовов на каждую итерацию. Пока ты этого не делаешь, я не думаю, что это действительно имеет значение ...
Что касается ссылки, имеющей значение, PHP использует копирование при записи, поэтому, если вы не будете записывать в массив, при циклировании будут относительно небольшие издержки. Однако, если вы начнете модифицировать массив внутри массива, именно здесь вы начнете видеть различия между ними (поскольку нужно будет скопировать весь массив, а ссылка может просто изменить встроенную строку) ...
Что касается итераторов, foreach
эквивалентно:
$it->rewind();
while ($it->valid()) {
$key = $it->key(); // If using the $key => $value syntax
$value = $it->current();
// Contents of loop in here
$it->next();
}
Поскольку существуют более быстрые способы итерации, это действительно зависит от проблемы. Но мне действительно нужно спросить, почему? Я понимаю, что хочу сделать вещи более эффективными, но я думаю, что вы тратите время на микрооптимизацию. Помните, Premature Optimization Is The Root Of All Evil
...
Редактировать: На основании комментария я решил сделать быстрый тестовый прогон ...
$a = array();
for ($i = 0; $i < 10000; $i++) {
$a[] = $i;
}
$start = microtime(true);
foreach ($a as $k => $v) {
$a[$k] = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";
$start = microtime(true);
foreach ($a as $k => &$v) {
$v = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";
$start = microtime(true);
foreach ($a as $k => $v) {}
echo "Completed in ", microtime(true) - $start, " Seconds\n";
$start = microtime(true);
foreach ($a as $k => &$v) {}
echo "Completed in ", microtime(true) - $start, " Seconds\n";
И результаты:
Completed in 0.0073502063751221 Seconds
Completed in 0.0019769668579102 Seconds
Completed in 0.0011849403381348 Seconds
Completed in 0.00111985206604 Seconds
Так что, если вы изменяете массив в цикле, использование ссылок в несколько раз быстрее ...
И накладные расходы только для ссылки на самом деле меньше, чем копирование массива (это на 5.3.2) ... Так что (как минимум на 5.3.2) кажется, что ссылки значительно быстрее ...