Привет.
Задача такая: динамически объединять двумерные массивы с целью получения одномерного. Остановился на использовании array_merge, но наткнулся на статью (http://p2k.ru/archives/44), где по результатам тестов не рекомендуется многократно активировать array_merge, а советуют сначала сделать набор из массивов, а потом запихнуть его в array_merge при помощи eval().
Примерно вот так. Сделал вроде работает, вроде быстрее. Но как-то не по программистки что-ли... Что думаете?
$str[1][]=1;
$str[1][]=2;
$str[1][]=3;
$str[2][]=4;
$str[2][]=5;
$str2=array();
foreach($str as $i=>$val)$str2[]='$str['.$i.']';
eval('$str3=array_merge('.implode(',',$str2).');');
foreach($str3 as $val)echo$val;
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
xlebosol
20.07.2013 - 14:18
"PHP5" Леон Аткинсон, Зеев Сураски 2006 - Избегайте использования функции eval.
Перед тем как углубиться в детали, запомните, что "eval() - это зло". ......
andrey888
20.07.2013 - 14:23
eval() == evil )
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Я тоже не люблю и даже не разу не использовал, но тут тесты показывают много кратное увеличение скорости скрипта.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
xlebosol
20.07.2013 - 14:34
Вместо eval(), лучше применить анонимную функцию.
xlebosol
Гм ... Интересная идея, как то их не использовал ни разу
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
xlebosol
Нет не подойдет....это все равно вызовет многократное использование array_merge.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
glock18
20.07.2013 - 15:53
eval = зло, но анонимку тут не применить насколько я вижу, поскольку кол-во массивов переменно.
ABC
смотрите сами на то, как это отражается на быстродействии.
Для сравнения было бы неплохо видеть и второй ваш вариант решения без eval. Как бы то ни было, если плохой eval оказывается здесь заметно быстрее необруганного array_merge (а быстродействие - то что всегда ставится в минус eval'у), то, очевидно, ругают не то.
xlebosol
20.07.2013 - 16:05
Тогда добро пожаловать в неизведанный мир итераторов (iteratorIterator, ArrayIterator) и т.д.. Что то array_merge не то мержит, в данном случае и без эвалов и array_merge можно обойтись.
Вот по тестил. Все же eval немного быстрее (не значительно, так что можно пренебречь). За то второй вариант красивее )
function genArray($a = 10, $b = 10)
{
$result = array();
for ($i = 0; $i < $a; ++$i) {
$result[] = array_fill(0, $b, hash('adler32', rand(0, 99)));
}
return $result;
}
$array = genArray(500, 500);
$start = microtime(true);
$str2 = array();
foreach ($array as $i => $val) $str2[] = '$array[' . $i . ']';
eval('$str3=array_merge(' . implode(',', $str2) . ');');
var_dump(microtime(true) - $start);
$start = microtime(true);
$reflection = new ReflectionFunction('array_merge');
$result = $reflection->invokeArgs($array);
var_dump(microtime(true) - $start);
результат
Цитата |
float 0.081470966339111 float 0.087764024734497 |
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.