[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: foreach VS while VS for
Gradus
какие минусы вижу я:
foreach - делает копию массива
while и for - применяют функции и присваивание

в общем что лучше использовать для оптимизации если ключи у массива разные и почему

$mas['am']=1;
....

$mas['ma']=1;

while($Mi=current($mas))
{
echo $Mi;
next($mas);
}
// or
foreach($mas as $key => $val) {
echo $val;
}




Спустя 28 минут, 46 секунд (12.01.2011 - 20:24) inpost написал(а):
Gradus
Покажи конкретный пример, лучше.

Спустя 3 минуты, 2 секунды (12.01.2011 - 20:27) Invis1ble написал(а):
да, а то ничего не понятно )

Спустя 5 секунд (12.01.2011 - 20:27) glock18 написал(а):
чего я не понял, так это - че за минусы еще такие, в особенности непонятный минус у while/for

заявление касательно foreach тоже беспочвенно несколько

а еще интересно, когда наконец перестанут темы а-ля "echo vs print", "foreach vs for" в ветке для знатоков

Спустя 4 минуты, 55 секунд (12.01.2011 - 20:32) Invis1ble написал(а):
glock18
Цитата
темы а-ля "echo vs print", "foreach vs for" в ветке для знатоков

biggrin.gif laugh.gif
была тема echo vs printf(), в ветке для начинающих. И там проходил конкретный эксперимент с конкретным кодом, а тут ниче не понятно.... что вообще ТС хотел сказать ))

Спустя 28 минут, 6 секунд (12.01.2011 - 21:00) Basili4 написал(а):
Цитата
Преждевременная оптимизация корень всех зол. Д. Кнут   


Так и чего вы на спичках экономит ???? какая разница какой из циклов быстрее.

Я как то видел код запиханный в один файл и за того что автор говорил что подключение файлов это операция требующая времени и значит для оптимизации её надо убрать.

по моему он где то тут и постился.

Спустя 50 секунд (12.01.2011 - 21:01) Gradus написал(а):
ребята как ещё конкретней вам пример показать ?
ладно попробую ещё разок:
представьте есть огромный многомерный массив , ключи в массиве не поочерёдные (всмысле без сортировки 1,2,3)

$mas['am']=array('a'=>1,'b'=>2,'c'=>3);
$mas['mac']=array('d'=>4,'e'=>5,'f'=>6);

и этот массив имеет размер допустим 999999
Какой перебор массива будет более оптимизированный, в плане того что меньше будет жрать памяти и по скорости будет работать быстрей и почему.
вот примеры выбора:
while($Mi=current($mas))
{
echo $Mi;
next($mas);
}

или использовать foreach
foreach($mas as $key => $val) {
echo $val;
}


Цитата
а еще интересно, когда наконец перестанут темы а-ля "echo vs print", "foreach vs for" в ветке для знатоков

я могу в ветке mysql создать тему "тяп-ляп", раз это кого то больше устроит.И сравнение по моему не объективное т.к. в циклах всё таки есть разница.

Цитата
так это - че за минусы еще такие

разжуём:
foreach копирует полностью массив и работает по копии
через while или for приходиться использовать функции current и next, а так же создавать единичную копию каждый цикл

Спустя 5 минут, 44 секунды (12.01.2011 - 21:06) Basili4 написал(а):
Цитата (Gradus @ 12.01.2011 - 22:01)
через while или for приходиться использовать функции current и next, а так же создавать единичную копию каждый цикл

?????? зачем

Спустя 7 минут, 31 секунда (12.01.2011 - 21:14) Gradus написал(а):
Basili4, у вас есть ответ ? Или надо просто придраться "пиши как работает".
Этот вопрос можешь в личку задать, тема не об этом.Но раз уж спросил тут,отвечу: попался очедной cms с очередными разработчиками считающими себя богами и разработанным собственным шаблонизатором.Весь код переделывать не получиться нужно хотя бы на мелочях оптимизировать код, тем более весь этот cms на огромных многомерных массивах висит

Спустя 5 минут, 6 секунд (12.01.2011 - 21:19) quickxyan написал(а):
думаю, что бред, если и есть различие, то минимальное и т.е. нечего сравнивать, а надо работать с тем циклом с каким удобнее.

Спустя 4 минуты, 20 секунд (12.01.2011 - 21:23) Basili4 написал(а):
Цитата (Gradus @ 12.01.2011 - 22:14)
тем более весь этот cms на огромных многомерных массивах висит

это и есть какашки а не циклы.

Спустя 1 минута, 52 секунды (12.01.2011 - 21:25) Gradus написал(а):
Я ни кого не переубеждаю что так распереживались , пользуйтесь на здоровье хоть рекурсией.
Вопрос что лучше для оптимизации, а не что удобней или красивей.

Спустя 3 минуты, 7 секунд (12.01.2011 - 21:28) Invis1ble написал(а):
Gradus
foreach специально для работы с массивами был создан, как думаешь, что оптимальней: юзать уже отимизированный под работу с массивами цикл или отдельный цикл в связке с двумя функциями? Я думаю, ответ очевиден...
А та cms.... ну пусть пишут как хотят =)

Спустя 27 минут, 29 секунд (12.01.2011 - 21:56) Gradus написал(а):
Invis1ble, да вот если бы они для себя писали, а то мучают бедных наивных заказчиков.А заказчики потом прогеров.Я кстати всегда склонялся с таким же мнением только если это не поочерёдный массив.Но как реализован foreach, я не знаю да и возможностей у него изначально чуть более будет чем мой пример с while, поэтому призадуматься можно,а вось и наоборот будет.

Спустя 15 минут, 1 секунда (12.01.2011 - 22:11) Invis1ble написал(а):
Gradus
для точного ответа тебе нужно обратиться к сишникам, чтоб они в исходниках поковырялись, или самому учить си wink.gif

Спустя 6 минут, 18 секунд (12.01.2011 - 22:17) Gradus написал(а):
да нет, вариант тестировать что быстрей.Не хотелось, думал подскажут, но видимо придётся тестить.Да и си в принципе основы знаю,но убивать много времени придётся на разборку кода smile.gif

Спустя 38 минут, 29 секунд (12.01.2011 - 22:55) glock18 написал(а):
Цитата (Gradus @ 12.01.2011 - 18:14)
Весь код переделывать не получиться нужно хотя бы на мелочях оптимизировать код, тем более весь этот cms на огромных многомерных массивах висит


ну ты нашел что оптимизировать - это не мелочь, а это капец какая геморная мелочь. с таким же успехом ты мог бы во всем коде переписывать с "some{$var}thing" на 'some' . $var . 'thing'. выигрыш получишь минимальный, а времени убьешь много. чаще всего оптимизировать надо датабазу, и прочие взаимодействия между серверами, а пробовать выиграть 0.05с, сделав столько чисто механической работы, при этом не гарантировав результат... ну ты понял

ЗЫ: какие бы "точные" цифры тебе не дали, эти точные цифры не буду отражать правду - хоть замеряйся. оптимизировать стоит только узкие участки (часто - взаимодействия между серверами).

Спустя 2 минуты, 42 секунды (12.01.2011 - 22:58) ИНСИ написал(а):
Gradus уже правильно сказали тебе:

1. foreach and for - специально для массивов. Где необходимо знать ключ и значение
2. while - удобная вещь, для вывода многих строк с БД ....

Что именно лучше??? Они одинаковы, просто работа с массива дает больше возможностей ...

Спустя 7 минут, 18 секунд (12.01.2011 - 23:05) Hoodzon написал(а):
Gradus,
Почитайте какую роль им отвели разработчики:
* Цикл с предусловием (while);
* Цикл с постусловием (do-while);
* Цикл со счетчиком (for);
* Специальный цикл перебора массивов (foreach).

Спустя 3 минуты, 38 секунд (12.01.2011 - 23:09) Gradus написал(а):
glock18, хотя бы будет чем отмазаться по оптимизации больше практически нечего делать smile.gif да и в 5 мб данных сколько выйгрыш такой будет интересно.
Другим концепцию вопроса не понимают видимо

Спустя 12 часов, 26 минут, 24 секунды (13.01.2011 - 11:36) Guest написал(а):
Если вникать во всякие нюансы php - может заболеть голова. Юзай foreach, по крайней мере, меньше голова болеть будет.

А по поводу массива в 99999 позиций - это ты там что держишь? И зачем создавать такой большой массив? Не проще ли парсить на выходе? Экономия памяти однако.

Спустя 6 минут, 10 секунд (13.01.2011 - 11:42) Gradus написал(а):
Guest, научитесь читать внимательней пожалуйста.
p.s. что за атака от Попова не пойму

Спустя 4 минуты, 34 секунды (13.01.2011 - 11:46) sergeiss написал(а):
Цитата (glock18 @ 12.01.2011 - 21:27)
а еще интересно, когда наконец перестанут темы а-ля "echo vs print", "foreach vs for" в ветке для знатоков

Это просто решается smile.gif 3-4 клика мышкой, и тема в разделе для начинающих. У тебя же есть права на это. Но в данном случае, наверное, "для начинающих" будет не совсем верно.

PS. По теме - предпочитаю использовать тот тип цикла, который удобнее по логике работы скрипта.

Спустя 11 минут, 37 секунд (13.01.2011 - 11:58) kirik написал(а):
Gradus
foreach может и не создавать копию массива, если массив по ссылке передать.
Все циклы из перечисленных применяются там где их удобно применять.

Спустя 10 минут, 33 секунды (13.01.2011 - 12:08) Gradus написал(а):
kirik, чёто я и не подумал даже про ссылку smile.gif

Спустя 2 минуты, 50 секунд (13.01.2011 - 12:11) linker написал(а):
kirik
Интересно, а в каких случаях foreach() создает копию массива?

Спустя 6 минут, 58 секунд (13.01.2011 - 12:18) glock18 написал(а):
он ее никогда не создает по простой причине, что пхп никогда (ну или почти) зря не копирует данные, передаваемые по значению. про отложенное копирование не забываем wink.gif

Спустя 5 минут, 40 секунд (13.01.2011 - 12:24) Gradus написал(а):
glock18, мануал говорит об обратном http://www.phpclub.net/manrus/cont/foreach.html

Спустя 2 минуты, 44 секунды (13.01.2011 - 12:27) Basili4 написал(а):
это я один вижу тут противоречия

Примечание: При старте foreach внутренний указатель массива автоматически устанавливается на первый элемент массива. Это означает, что вам не нужно вызывать reset() перед началом выполнения цикла foreach.

Примечание: Обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал.

Спустя 7 минут, 32 секунды (13.01.2011 - 12:34) Gradus написал(а):
Basili4, странность есть но можно предположить что указатель сдвигает на оригинале и на копии.Хотя зачем это, может для визуальности ...

Спустя 4 минуты, 33 секунды (13.01.2011 - 12:39) Basili4 написал(а):
Gradus
может быть и так...

Спустя 20 минут, 14 секунд (13.01.2011 - 12:59) glock18 написал(а):
Gradus

ну вообще пых не копирует данные до тех пор, пока в этом нет прямой необходимости. даже если ты передаешь аргумент функции по значению, это не значит, что он будет "скопирован". почти наверняка так же и тут - не знаю как ты, но мне думается, что на больших массивах это было прекрасно заметно, и недопустимо.

Спустя 2 часа, 3 минуты, 17 секунд (13.01.2011 - 15:02) linker написал(а):
Цитата
Примечание: Обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал.
Где эту чушь написали, случайно не на php.su? Проверяем едрить-мадрить
<?php
$a = array(1,2,3,4,5);
foreach($a as $i => $v)
{
echo "$i = $v<br>";
if($i == 3) break;
}

list($i, $v) = each($a);
echo "$i = $v<br>";
?>
Как и ожидалось вывелось
0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
ни с какой копией массивов foreach() не работает, а работает с оригиналом и вполне пристойно меняет внутри указатель на элементы.

Спустя 3 минуты, 59 секунд (13.01.2011 - 15:06) Basili4 написал(а):
Ешкин кошкин вся оптимизация коту по хвост и как теперь оптимизировать код ума не приложу. smile.gif)))


Спустя 3 минуты, 1 секунда (13.01.2011 - 15:09) Hoodzon написал(а):
Linker для тебя и всех остальных:
Цитата
Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.


Цитата
Мудрый процент сомнения – лучший фундамент любой уверенности.

Спустя 3 минуты, 47 секунд (13.01.2011 - 15:13) linker написал(а):
Hoodzon
Я не верю словам, я верю опыту. А приведенный мной опыт показывает, что сие утверждение - ложно.

Спустя 21 секунда (13.01.2011 - 15:13) Basili4 написал(а):
Hoodzon
ага а при выходе из цикла копирует его обратно. ???? или указатель ворочает в обоих массивах.

Спустя 1 минута, 20 секунд (13.01.2011 - 15:15) Hoodzon написал(а):
linker, не веришь мне и оф. доку спроси у любого более менее опытного разработчика того же C#

Спустя 26 секунд (13.01.2011 - 15:15) linker написал(а):
Basili4
Не слушай, foreach() аналогичен each(), только первый делает это в цикле от начала и до конца массива.

Hoodzon
У нас тут не С#, а PHP. Еще прошу обратить внимание на мой пример. Если не веришь, что foreach() меняет указатель в массиве, то скопируй код и выполни. Теория хорошо, а вот практика иногда опровергает теорию.

Спустя 3 минуты, 11 секунд (13.01.2011 - 15:18) Basili4 написал(а):
А где можно исходник пыхи слить ?? может просто поглядеть копирует там чего или нет

Спустя 52 секунды (13.01.2011 - 15:19) linker написал(а):
На php.net

Спустя 2 минуты, 10 секунд (13.01.2011 - 15:21) sergeiss написал(а):
Цитата (linker @ 13.01.2011 - 16:02)
Где эту чушь написали, случайно не на php.su?

Я не совсем понял, что ты назвал "чушью", и что ты хотел проверить, но в хэлпе написано вот это (то же самое, но только по-английски):
Цитата
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.


Полный текст вот тут: http://ru2.php.net/manual/en/control-structures.foreach.php Там же есть и примеры.

Спустя 2 минуты, 59 секунд (13.01.2011 - 15:24) linker написал(а):
sergeiss
Эээ, в официальном мануале речь немного о другом. Я же назвал чушью
Цитата
Примечание: Обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал.

Спустя 37 секунд (13.01.2011 - 15:25) Hoodzon написал(а):
sergeiss, чуть выше тоже самое пытался это ему объяснить.
У нас своя правда, у него своя. smile.gif

Спустя 2 минуты, 39 секунд (13.01.2011 - 15:28) linker написал(а):
Ессесно у каждого своя, нам же влом читать чужие посты.

Спустя 1 минута, 16 секунд (13.01.2011 - 15:29) sergeiss написал(а):
linker - сравни:
Цитата
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.

Цитата
Примечание: Обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом



Или ты о чем-то другом??? Если "о другом", тогда не цитируй ЭТИ строки, не вводи в заблуждение smile.gif

Спустя 10 минут, 35 секунд (13.01.2011 - 15:39) linker написал(а):
И все? А дальше кто читать будет? Это разрабы вводят в заблуждение, может внтурях у себя он что-то и делает такое с массивом, чтобы проще было отдавать ключ и значение, но в нашем представлении все выглядит вполне естественно - указатель сдвигается, значение можно изменить $array[$key] = $value + 1; та же конструкция foreach($array => &$value) { $value ++; } дает указатель на значение в оригинальном массиве, а не в специфицированной копии. И вообще я думаю, что под этим имеется ввиду следующее:

Что отдает each()? Массив она отдает, чем не специфицированная копия. Так и здесь foreach() на текущем элементе внутрях работает с копией как при each(). В том же мануале дали эквивалентные примеры
while(list($key, $value) = each($array)) {}
foreach($array as $key => $value) {}
посему ест ьвсе основания утверждать, что foreach() не копирует массив $array, а речь идет как раз о том, что я написал чуть выше, т.е. о копии ключа и значения обернутые в массив.

Спустя 5 минут, 29 секунд (13.01.2011 - 15:45) sergeiss написал(а):
Цитата (linker @ 13.01.2011 - 16:39)
значение можно изменить $array[$key] = $value + 1

Это ты уже работаешь с оригинальным массивом, а не разработчики smile.gif

Ты попробуй написать вместо этого $value += 1 и после цикла посмотри, изменилось ли что-нибудь. Об этом идет речь-то, когда говорят о том, что идет работа с копией. А если ты указал в явном виде (именно ты, а не цикл!), что работаешь с элементом оригинального массива... То тогда, естественно, ты его и изменишь.

Спустя 10 минут, 6 секунд (13.01.2011 - 15:55) linker написал(а):
sergeiss
Ничего не изменилось, это понятно, потому что тут не ссылка и массив отдан не ввиде ссылки. И именно об этом идет речь. Что если массив отдается ссылкой, то foreach() приходится работать с реальными значениями ключа и элемента. Но когда просто отдается массив, то работа идет с копиями ключа и значения, которые внтурях PHP являются массивом аналогичным от each().

Спустя 17 минут, 19 секунд (13.01.2011 - 16:12) Gradus написал(а):
linker, я не совсем тебя понял.То есть ты упираешься что копия всего массива имеет отличие от поочерёдной копии каждого элемента и не заслуживает фразы "работает с копией массива" или "копирует массив" ?

Спустя 18 минут, 29 секунд (13.01.2011 - 16:31) glock18 написал(а):
Цитата (Gradus @ 13.01.2011 - 13:12)
поочерёдной копии каждого элемента


поочередная копия массива делается почти в любом цикле, так что мимо кассы...

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

Спустя 9 минут, 1 секунда (13.01.2011 - 16:40) linker написал(а):
Еще раз объясню на примере
list($key, $value) = each($array);
идентично
foreach($array as $key => $value) { break; }
в обоих случаях $value есть копия значения элемента массива. Однако
foreach($array as $key => &$value) { break; }
здесь $value есть ссылка на оригинальное значение в массиве. Именно об этом разрабы PHP толкую у себя в мануале, а не о том, что foreach() сначала копирует массив, а потом с ним работает.

Спустя 8 минут, 25 секунд (13.01.2011 - 16:48) Gradus написал(а):
Цитата
поочередная копия массива делается почти в любом цикле

Цитата
идентично

так никто и не спорит
я пример в 1 посте показывал тоже практически идентичные, вопрос то какой оператор справился бы лучше (упёртость в создании этих операторов в си), но он уже опустился и не требует ответа.

Спустя 5 часов, 20 минут, 5 секунд (13.01.2011 - 22:08) kirik написал(а):
Фигасе темка раздулась smile.gif

linker донёс до меня суть происходящего, спасибо! До этого я как-то не особо задумывался как там foreach работает (создает он копию массива, или лишь копию элемента с которым работает).

Спустя 10 минут, 13 секунд (13.01.2011 - 22:19) Basili4 написал(а):
kirik
Холивар батенька.

Спустя 4 часа, 8 минут, 55 секунд (14.01.2011 - 02:27) kirik написал(а):
Закреплю-ка тему..

Спустя 3 дня, 18 часов, 39 минут, 36 секунд (17.01.2011 - 21:07) Dron19 написал(а):
foreach - работает медленно, медленнее всего из этих циклов, а for и while работают примерно одинаково

Спустя 3 часа, 11 минут, 11 секунд (18.01.2011 - 00:18) kirik написал(а):
Цитата (Dron19 @ 17.01.2011 - 13:07)
foreach - работает медленно, медленнее всего из этих циклов, а for и while работают примерно одинаково

Но мы-то знаем, что это не так smile.gif

Спустя 17 часов, 38 минут, 59 секунд (18.01.2011 - 17:57) Dron19 написал(а):
Цитата (kirik @ 17.01.2011 - 21:18)

Но мы-то знаем, что это не так smile.gif

Что именно не так?

Спустя 12 минут, 30 секунд (18.01.2011 - 18:10) twin написал(а):
Тут эпизодически всплывает эта тема, kirik не зря закрепил. Меряли уже несколько раз. Самый медленный - while, если не ошибаюсь.

Приведи тест, посмотрим.

Спустя 1 час, 33 минуты, 32 секунды (18.01.2011 - 19:43) DedMorozzz написал(а):
я мерял - вайл оказался самым быстрым. Ибо условие самое простое.
Форич работает с КОПИЕЙ массива!
Иначе код:
$a = array('a'=>'12','a2'=>'123','a3'=>'412','a4'=>'12','a5'=>'122');

foreach($a as $b => $c){
$b = $b.'zzz';
}
echo "<pre>";
print_r($a);
echo "</pre>";

Вывел бы все элементы "б" измененые, ибо изменения коснулись оригинального массива. А так только копию. Вот и пример! Так же люди, которые писали это пишут, что работает с копией, а ты(Linker) гришь "да они не нают, что пишут, они не правы! На самом деле..." :)

Спустя 5 минут, 41 секунда (18.01.2011 - 19:49) DedMorozzz написал(а):
Аааа...немного не вник, учитывая:
Цитата
Но когда просто отдается массив, то работа идет с копиями ключа и значения
Линкер вероятно и прав. Там уже не проверял. Но то что копия элементов - 100%

Спустя 2 часа, 35 минут, 32 секунды (18.01.2011 - 22:24) glock18 написал(а):
Цитата (DedMorozzz @ 18.01.2011 - 16:49)
Но то что копия элементов - 100%


ну об этом было бы совершенно нелепо спорить

Спустя 10 часов, 22 минуты, 10 секунд (19.01.2011 - 08:47) Alex VoDevil написал(а):
2 Gradus: Если про foreach - это правда что он берет массив не по ссылке, а мне тоже припоминается что-то подобное. Я помню мне надо было не проходить по всему массиву, а в зависимости от уже попавшихся ключей удалять и не проверять некоторые следующие. Так вот я юзал while($next = each($array)){ } , а удаление пар внутри цикла foreach помнится количества шагов не сократило. Так вот если брать за константу то что foreach берет массив не по ссылке а по значению, тогда его использование на больших массивах смерти подобно. Я сейчас работаю над демоном, который по роковому стечению обстоятельств написан на php (до меня). Так вот он сидит и ворочает массивом ключевых слов, который в пике может дорастать до 512 Мб, там переборы все организованы через for() . Получается что если я заюзаю foreach то отожру уже 1 Гб ОЗУ, сами видите - разница примерно в объем фильмеца в плохом качестве.

Спустя 10 минут, 17 секунд (19.01.2011 - 08:57) kirik написал(а):
Цитата (Alex VoDevil @ 19.01.2011 - 00:47)
Получается что если я заюзаю foreach то отожру уже 1 Гб ОЗУ, сами видите - разница примерно в объем фильмеца в плохом качестве.

Вы пост перечитайте, потом пишите ерунду. Копируется только тот элемент который проходит в данной итерации.

Спустя 2 часа, 59 минут, 8 секунд (19.01.2011 - 11:56) glock18 написал(а):
kirik
Читать тему? фу как неинтересно smile.gif

Спустя 1 день, 10 часов, 21 секунда (20.01.2011 - 21:56) Dron19 написал(а):
я в книге читал, что foreach медленнее for и while

Спустя 5 дней, 20 часов, 13 минут (26.01.2011 - 18:09) Snus написал(а):
Dron19
Пишите так:
foreach($arr as &$val){
...
}

И не будет клонирования.

Спустя 4 минуты, 41 секунда (26.01.2011 - 18:14) twin написал(а):
Dron19
Цитата
я в книге читал, что foreach медленнее for и while

Книгам верить нельзя. Их люди пишут, а им свойственно ошибаться.

Спустя 18 минут, 39 секунд (26.01.2011 - 18:33) twin написал(а):
И вообще, дабы не продолжать, поставим жирную точку.

Говорить, что какой то из этих циклов быстрее, это тоже самое, что говорить "кит сильнее слона".

Эти циклы предназначены для совершенно разных задач. Ибо невозможно одним только циклом while перебрать массив. Так же нельзя это сделать и циклом for. Придется задействовать дополнительные функции. А вот foreach делает это сам. По этому при переборе массива быстрее и удобнее foreach, для того он и сделан. Кто не верит, смотрим сюда:

<?php

$arr = range(0, 100000);

$s = microtime(1);

while(list($b) = each($arr));

echo (microtime(1) - $s), '<br>';
$s = microtime(1);

$c = count($arr);
for($i = 0; $i <= $c; ++$i)
$b = $arr[$i];

echo (microtime(1) - $s), '<br>';
$s = microtime(1);

foreach($arr as $b);

echo (microtime(1) - $s), '<br>';

3.50645279884
0.0470080375671
0.0149841308594

Спустя 3 дня, 17 часов, 34 минуты, 26 секунд (30.01.2011 - 12:07) Snus написал(а):
twin
Кэп, держи +

Спустя 1 месяц, 1 день, 10 часов, 33 минуты, 8 секунд (1.03.2011 - 22:40) jamals написал(а):
foreach это быстрее загрузит чем остальное. Так что лучше применять это чем while or for

Спустя 8 дней, 15 часов, 55 минут, 54 секунды (10.03.2011 - 14:36) Gradus написал(а):
jamals - ну прям капитан очевидность после выше указанного теста

Спустя 7 месяцев, 15 дней, 5 часов, 3 минуты, 38 секунд (25.10.2011 - 18:40) Alinka_) написал(а):
ребят, не поможете в написании программки маленькой с помощью цикла??

Спустя 11 минут, 31 секунда (25.10.2011 - 18:51) Winston написал(а):
Цитата (Alinka_) @ 25.10.2011 - 18:40)
ребят, не поможете в написании программки маленькой с помощью цикла??

За деньги любой каприз smile.gif

Спустя 20 секунд (25.10.2011 - 18:52) Игорь_Vasinsky написал(а):
создай тему и напиши там.

Спустя 1 месяц, 3 часа, 59 минут, 20 секунд (25.11.2011 - 22:51) 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 может устроить чудо всей оптимизации.

Оптимизации не зло, просто нужно рационально подходить к вопросу, а не оптимизировать любое хеллоу ворлд приложение и тратить на разработку кучу времени.

Спустя 3 месяца, 28 дней, 14 часов, 2 минуты, 35 секунд (24.03.2012 - 12:54) Guest написал(а):
несомненно foreach, он специально был создан для работы с массивами. Против разработчиаков не попрешь!


_____________
ДАВАЙ ДЕНЬГИ
R543264623869
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.