цикл for или же все таки foreach?
Давно интересует этот вопрос и ответ я на него не нашел:(
Спустя 11 минут, 29 секунд (20.04.2012 - 13:18) Guest написал(а):
это 2е разные функции и каждая используется в КОНКРЕТНО ПОДХОДЯЩЕЙ ситуации
вопрос сродни что лучше камаз или легковой автомобиль.
Обе фунеции нужны, которая удобнее ту и используй. А сравнения скоростей - абсурдно в данном вопросе, просто несущественная разница
вопрос сродни что лучше камаз или легковой автомобиль.
Обе фунеции нужны, которая удобнее ту и используй. А сравнения скоростей - абсурдно в данном вопросе, просто несущественная разница
Спустя 6 минут, 8 секунд (20.04.2012 - 13:24) Renden написал(а):
yurayu92
For быстрее..
For быстрее..
Спустя 1 минута, 21 секунда (20.04.2012 - 13:26) dadli написал(а):
yurayu92
настолко я знаю, foreach бистрее, но не значително, разница очен маленкая и он видимо толко на работе очен балших масивах
настолко я знаю, foreach бистрее, но не значително, разница очен маленкая и он видимо толко на работе очен балших масивах
Спустя 3 минуты, 32 секунды (20.04.2012 - 13:29) Guest написал(а):
Забиваете голову хернёй. Что надо то и юзайте. Это 2 РАЗНЫЕ "функции"
Лично я в силу своего проекта юзаю 199 раз форич и 1 раз фор, когда явно нужен инкримент, но такое бывает невероятно редко
Лично я в силу своего проекта юзаю 199 раз форич и 1 раз фор, когда явно нужен инкримент, но такое бывает невероятно редко
Спустя 1 час, 39 минут, 18 секунд (20.04.2012 - 15:09) inpost написал(а):
foreach - для перебора массива, и только его. Выполняя свою конкретную задачу, которую делает быстрее, для этого она и индивидуальна!
Спустя 17 часов, 16 минут, 39 секунд (21.04.2012 - 08:25) Эли4ка написал(а):
inpost
как раз по теме
Мне нужно перебрать два массива,но как это можно сделать с foreach?Два foreach использовать не получится..лишние данные получаются..
как раз по теме
Мне нужно перебрать два массива,но как это можно сделать с foreach?Два foreach использовать не получится..лишние данные получаются..
Спустя 38 минут, 36 секунд (21.04.2012 - 09:04) T1grOK написал(а):
Цитата (Эли4ка @ 21.04.2012 - 06:25) |
inpost как раз по теме Мне нужно перебрать два массива,но как это можно сделать с foreach?Два foreach использовать не получится..лишние данные получаются.. |
Что значит лишние?! Правильно именуй переменные и они не будут казаться лишними.
А вообще по теме, равносильно спрашивать, что лучше 2+1 или 1+2). Я использую где только возможно foreach. И меня не волнует кто быстрее for или foreach. Есть более важные места которые ощутимо влияют на производительность приложения, такие как выборка из базы, оптимальное построение запросов и т.д.
Спустя 40 минут, 46 секунд (21.04.2012 - 09:45) glock18 написал(а):
Цитата (Renden @ 20.04.2012 - 11:24) |
yurayu92 For быстрее.. |
Цитата (dadli @ 20.04.2012 - 11:26) |
yurayu92 настолко я знаю, foreach бистрее, но не значително, разница очен маленкая и он видимо толко на работе очен балших масивах |
еще версии?
yurayu92, я так понимаю сразу после получения на этот вопрос, последуют: "что лучше print или echo" и "что лучше - конкатенация или in-string variables". и то, и другое, и данный топик - банальнейший холивар, не заслуживающий даже 5 минут раздумья на эту тему. даже при том что concat vs in-string vars имеет и более веские доводы против одного из методов, чем удобство, мизерная прибавка в скорости или иные эфемерные плюсы и минусы
Спустя 33 минуты, 49 секунд (21.04.2012 - 10:18) Dezigo написал(а):
FOR пробегает по масиву (индексам)
FOREACH - когда пробегает создаёт копию массива
чтобы работало быстрее и передовалось значение по ссылкам надо писать
Поэтому FOR быстрее.
FOREACH - когда пробегает создаёт копию массива
$array = array("test","apple");
foreach($array as $v) {
$v = "YRA!";
}
чтобы работало быстрее и передовалось значение по ссылкам надо писать
foreach($array as &$v) {
$v = "YRA";
}
Поэтому FOR быстрее.
Спустя 7 минут, 49 секунд (21.04.2012 - 10:26) vagrand написал(а):
Давненько я тестил и вроде как самый быстрый способ цикла это while
Спустя 23 минуты, 32 секунды (21.04.2012 - 10:50) glock18 написал(а):
Dezigo
vagrand
я видел ни один тест, где foreach был быстрее
vagrand
я видел ни один тест, где foreach был быстрее
Спустя 19 минут, 58 секунд (21.04.2012 - 11:10) Dezigo написал(а):
glock18 покажи тест
Спустя 37 минут, 52 секунды (21.04.2012 - 11:48) glock18 написал(а):
Цитата (Dezigo @ 21.04.2012 - 09:10) |
glock18 покажи тест |
ну, ты ведь не думаешь, что я запоминаю, где подобная чушь лежит
чего там показывать. напиши свой самый простенький, и увидишь, что погрешность вычислений слишком велика для того, чтобы объективно оценить что из этого быстрее.
Ты рассуждает логически верно, но есть "но", как всегда:
1. в пыхе передача параметра по ссылке работает через заднее место из-за его отложенного копирования, и поэтому по ссылке вообще не рекомендуется передавать что-либо, если только не предполагается изменение значения по ссылке.
пример на память:
$a = 10;
$b = $a;
foo($b);
function foo(&$a)
{
echo $a;
}
здесь из-за передачи по ссылке и отложенного копирования при вызове foo() будет, как это ни парадоксально на первый взгляд, значение будет скопировано. А если точнее, то произойдет разделение значений $a и $b.
И вообще, очень полезная практика передачи по ссылке в других языках программирования в пыхе приобрела какой-то извращенный вид, увы.
В итоге получается, что пых дурит головы тем, кто привык мыслить по-нормальному, не вникая в его "закидоны".
И потому я, прекрасно понимая то, что если без создания копий значения приложение должно работать быстрее, не берусь утверждать то же самое касательно пыха, и вам тоже не советую этого делать. А потому while/for/foreach, если не показывают устойчивых расхождений в результатах, для меня абсолютно одинаковы.
Спустя 3 минуты, 25 секунд (21.04.2012 - 11:51) Эли4ка написал(а):
T1grOK
мне надо разложить сразу два массива одновременно,а если я поочередно это делаю,то сначала первый массив,потом второй и первый массивы вместе..
мне надо разложить сразу два массива одновременно,а если я поочередно это делаю,то сначала первый массив,потом второй и первый массивы вместе..
Спустя 3 минуты, 27 секунд (21.04.2012 - 11:54) glock18 написал(а):
Dezigo
вот, наскорую руку слабал тестик потребления памяти для проверки, что там где копируется:
лучше смотреть исходник страницы или через консоль выполнять. результаты малость удивили, пробовал for ставить 1м, 2м и 3м, и везде он потребляет порядка 112 байт больше, чем любой из форичей. А подтверждением моих слов выше, оба форича потребляют одинаково памяти.
вот, наскорую руку слабал тестик потребления памяти для проверки, что там где копируется:
$arr = range(1, 100000);
printf("%70s %s\n", 'Initial memory usage:', memory_get_usage());
// for
$size = sizeof($arr);
$mem = 0;
for ($i = 0; $i < $size; $i++)
{
$mem = max(memory_get_usage(), $mem);
}
unset($size);
printf("%70s %s\n", '(For) max memory allocated:', $mem);
// foreach
$mem = 0;
foreach ($arr as $i)
{
$mem = max(memory_get_usage(), $mem);
}
printf("%70s %s\n", '(Foreach, no reference usage) max memory allocated:', $mem);
$mem = 0;
foreach ($arr as &$i)
{
$mem = max(memory_get_usage(), $mem);
}
unset($i);
printf("%70s %s\n", '(Foreach, reference usage) max memory allocated:', $mem);
лучше смотреть исходник страницы или через консоль выполнять. результаты малость удивили, пробовал for ставить 1м, 2м и 3м, и везде он потребляет порядка 112 байт больше, чем любой из форичей. А подтверждением моих слов выше, оба форича потребляют одинаково памяти.
Спустя 1 день, 11 часов, 12 минут, 44 секунды (22.04.2012 - 23:07) killer8080 написал(а):
Глупости это все. Для работы с массивами только foreach. Каждому инструменту свое назначение, и дело тут даже не в мнимом быстродействии (хотя foreach однозначно быстрей), а в том, что for в php не предназначен для работы с массивами и использовать его для этих целей не корректно, и грозит подводными камнями.
Спустя 1 час, 10 минут, 1 секунда (23.04.2012 - 00:17) I++ написал(а):
Цитирую сам себя:
Цитата |
Свернутый текст // Способ №1. Простой foreach без ключа foreach ($array as $item){ $summ += $item; } // Способ №2. Foreach с выборкой ключа foreach ($array as $key=>$item){ $summ += $item; } // Способ №3. Foreach с получением значения по ссылке foreach ($array as $key=>&$item){ $summ += $item; } // Способ №4. Цикл For и функция next() $summ = current($array); for ($i = 0; $i < $size; $i++){ $summ += next($array); } //Способ №5. While и функция each() while (list($key, $value) = each($array)){ $summ += $value; } //Способ №6. Обычный For for ($i=0; $i<$count; $i++){ $summ += $array[$i]; } Способ №1. Простой foreach без ключа 0.112 с Способ №2. Foreach с выборкой ключа 0.131 с Способ №3. Foreach с получением значения по ссылке 0.144 с Способ №4. Цикл For и функция next() 0.383 с Способ №5. While и функция each() 1.180 с Способ №6. Обычный For 0.120 с Все зависит от конкретной ситуации применения, это раз, во 2 если Вы пишите приложение критичное к производительности, юзаем Vulcan Logic Disassembler, смотрим опкоды, меньшее количество опкодов лучше, но это не значит, что оно быстрее, все зависит от того как реализовано на С++ это. Плюс оптимизированное приложение будет воркать с предсказуемым результатом, только на той версии php под которую писали. А если не виндоус, что скорее всего, то апдейты каких либо реквайров помимо основного php может устроить чудо всей оптимизации. Оптимизации не зло, просто нужно рационально подходить к вопросу, а не оптимизировать любое хеллоу ворлд приложение и тратить на разработку кучу времени. |
Спустя 8 часов, 14 минут, 20 секунд (23.04.2012 - 08:32) killer8080 написал(а):
Дело не в том, что быстрее, а чем грозит неправильное использование инструмента.
Простой пример
вроде все нормально, на выходе получили 12345, как и ожидалось
Усложняем задачу
и что же мы видим, вместо ожидаемого вывода 1235, получили 123 и нотис
а все потому, что count() не годится для определения последнего индекса массива в общем случае. При её использовании нужно всегда быть уверенным, что из массива ничего не удалялось, его не прогоняли через array_filter() и т.п. Исправляем баг
Итого, что мы имеем, бессмысленное усложнение кода, порождаем ненужные переменные, создаем массив из ключей, проходим по нему в поисках максимального значения (что по сути уже цикл), на каждой итерации делаем дополнительную проверку, на существование офсета, и все ради чего?
Ну и наконец последний гвоздь в гроб for, вопрос на засыпку - сколько итераций проделает for, чтоб перебрать массив из 3-х элементов?
Каждому инструменту, свое назначение, если разработчики нам предоставили специализированный инструмент, для решения задачи, то его и нужно использовать.
PS про то что в массиве могут быть еще и ассоциативные ключи я промолчу.
Простой пример
$arr = range(1, 5);
$count = count($arr);
for($i = 0; $i < $count; $i++){
echo $arr[$i];
}
вроде все нормально, на выходе получили 12345, как и ожидалось
Усложняем задачу
$arr = range(1, 5);
unset($arr[3]);
$count = count($arr);
for($i = 0; $i < $count; $i++){
echo $arr[$i];
}
и что же мы видим, вместо ожидаемого вывода 1235, получили 123 и нотис
а все потому, что count() не годится для определения последнего индекса массива в общем случае. При её использовании нужно всегда быть уверенным, что из массива ничего не удалялось, его не прогоняли через array_filter() и т.п. Исправляем баг
$arr = range(1, 5);
unset($arr[3]);
$count = max(array_keys($arr)) + 1;
for($i = 0; $i < $count; $i++){
if(!isset($arr[$i])) continue;
echo $arr[$i];
}
Итого, что мы имеем, бессмысленное усложнение кода, порождаем ненужные переменные, создаем массив из ключей, проходим по нему в поисках максимального значения (что по сути уже цикл), на каждой итерации делаем дополнительную проверку, на существование офсета, и все ради чего?
Ну и наконец последний гвоздь в гроб for, вопрос на засыпку - сколько итераций проделает for, чтоб перебрать массив из 3-х элементов?
$arr = array(0 => 'a', 1 => 'b', 10000000 => 'c');
$count = max(array_keys($arr)) + 1;
for($i = 0; $i < $count; $i++){
if(!isset($arr[$i])) continue;
echo $arr[$i];
}
Каждому инструменту, свое назначение, если разработчики нам предоставили специализированный инструмент, для решения задачи, то его и нужно использовать.
PS про то что в массиве могут быть еще и ассоциативные ключи я промолчу.
Спустя 22 часа, 18 минут, 47 секунд (24.04.2012 - 06:50) Эли4ка написал(а):
killer8080
а можно как-нибудь два массива разложить за один foreach ?
а можно как-нибудь два массива разложить за один foreach ?
Спустя 1 час, 4 минуты, 54 секунды (24.04.2012 - 07:55) killer8080 написал(а):
Цитата (Эли4ка @ 24.04.2012 - 07:50) |
killer8080 а можно как-нибудь два массива разложить за один foreach ? |
Что ты имеешь ввиду?
Спустя 13 минут, 57 секунд (24.04.2012 - 08:09) glock18 написал(а):
Цитата (killer8080 @ 24.04.2012 - 05:55) |
Что ты имеешь ввиду? |
что-то типа этого
$arr1 = array(1 => 1, 2 => 2, 3 => 3);
$arr2 = array(1 => 'a', 2 => 'b', 3 => 'c');
foreach ($arr1 as $key => $value)
{
echo $arr1[$key] . ' - ' . $arr2[$key] . "<br />\n";
}