[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: array_walk vs foreach
iVasya
http://habrahabr.ru/post/11553/
Автор этой статьи, в разделе "Этап 1. Пишем" пишет следующее:
Цитата
Для итерации по массивам, их изменению и фильтрации — учимся использовать array_* функции в пхп. Особенно лямбда-функции:

<?php
       
$arr = array('that', 'is', 'this');
array_walk($arr, create_function('&$v,$k', '$v = $v . " yeah";');
print_r($arr);

// outputs:
// Array
// (
//  [0] => that yeah
//  [1] => is yeah
//  [2] => this yeah
// )


// А вы бы сделали это циклом? Ай-ай-ай...

Можете прокомментировать это?
Функцию array_walk можно действительно считать более быстрому заменителю тому же, форичу, например?
Если нет, то в чем тогда разница между ними?



Спустя 19 минут, 10 секунд (30.09.2012 - 21:46) inpost написал(а):
потому что foreach - переход по массиву, идёшь себе и выводишь данные, если надо.
А array_walk - для других целей.

А быстрее - возьми и замерь скорость сам. И вообще, сейчас много всяких ново-кодеров, которые советуют всё подряд.

Спустя 3 минуты, 44 секунды (30.09.2012 - 21:49) iVasya написал(а):
Если цель что-то сделать с каждым элеметном массива (не вывести, а именно сделать)
Тут подойдут и foreach, и array_walk, в равной степени, я не прав?

Спустя 11 минут, 48 секунд (30.09.2012 - 22:01) inpost написал(а):
конечно.

Спустя 1 час, 5 секунд (30.09.2012 - 23:01) iVasya написал(а):
Конечно НЕ прав или конечно прав?
И если не прав - то как правильно?
Вроде ж и с помощью array_walk, и форичем можно делать одни и те же вещи...

Спустя 15 минут, 13 секунд (30.09.2012 - 23:17) Invis1ble написал(а):
Уже бы сам замерял давно и сравнил скорость. array_walk() быстрее, чем foreach
В цитате с хабра все правильно написано.


UPDATE. Щас ради интереса перепроверил - foreach все-таки быстрей. Что-то я напутал.

Спустя 10 часов, 52 минуты, 24 секунды (1.10.2012 - 10:09) killer8080 написал(а):
То же решил потестить
$a = range(1, 100000); 
$s = microtime(1);
$m = memory_get_usage();
foreach($a as $k => $v){
$a[$k] .= 'text';
}
$time = microtime(1) - $s;
$m = memory_get_usage() - $m;
echo 'foreach by key: <br />time: '.$time.'<br />memory: '.$m.'bytes<br /><br />';

$a = range(1, 100000);
$s = microtime(1);
$m = memory_get_usage();
foreach($a as &$v){
$v .= 'text';
}
unset($v);
$time = microtime(1) - $s;
$m = memory_get_usage() - $m;
echo 'foreach by reference: <br />time: '.$time.'<br />memory: '.$m.'bytes<br /><br />';

$a = range(1, 100000);
$s = microtime(1);
$m = memory_get_usage();
$c = count($a);
for($i = 0; $i < $c; $i++){
$a[$i] .= 'text';
}
$time = microtime(1) - $s;
$m = memory_get_usage() - $m;
echo 'for: <br />time: '.$time.'<br />memory: '.$m.'bytes<br /><br />';

$a = range(1, 100000);
$s = microtime(1);
$m = memory_get_usage();
array_walk($a, create_function('&$v', '$v .= "text";'));
$time = microtime(1) - $s;
$m = memory_get_usage() - $m;
echo 'array_walk: <br />time: '.$time.'<br />memory: '.$m.'bytes<br /><br />';

Вот результаты
foreach by key: 
time: 0.12844800949097
memory: 3596508bytes

foreach by reference:
time: 0.076018095016479
memory: 3595988bytes

for:
time: 0.074935913085938
memory: 3596608bytes

array_walk:
time: 0.16262006759644
memory: 3597156bytes


В общем как и ожидал, array_walk дал худший результат. Лидер foreach с передачей по ссылке for самый быстрый вариант, но отрыв от форича по ссылке весьма незначителен, за то последний выигрывает по расходу памяти. Но в целом разница копеечная, так что можешь смело забить на это user posted image

UPD забыл про for, куда же без него user posted image

Спустя 1 час, 50 минут, 58 секунд (1.10.2012 - 12:00) inpost написал(а):
Вот и я о том же, новости на хабре почитать интересно, но профессионализмом там в общем не пахнет... Все кому не лень что-то пишут-пишут...
Спасибо за тесты.
Быстрый ответ:

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