
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
۩
Дата
|
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
Привет.
Задача такая: динамически объединять двумерные массивы с целью получения одномерного. Остановился на использовании array_merge, но наткнулся на статью (http://p2k.ru/archives/44), где по результатам тестов не рекомендуется многократно активировать array_merge, а советуют сначала сделать набор из массивов, а потом запихнуть его в array_merge при помощи eval(). Примерно вот так. Сделал вроде работает, вроде быстрее. Но как-то не по программистки что-ли... Что думаете?
-------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
![]() |
|
![]() ![]() Знатный быдлокодер ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 337 Пользователь №: 32761 На форуме: Карма: 19 ![]() |
"PHP5" Леон Аткинсон, Зеев Сураски 2006 - Избегайте использования функции eval.
Перед тем как углубиться в детали, запомните, что "eval() - это зло". ...... |
![]() |
|
![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 805 Пользователь №: 27801 На форуме: Карма: 14 ![]() |
eval() == evil )
-------------------- Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. ) |
![]() |
۩
Дата
|
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
Я тоже не люблю и даже не разу не использовал, но тут тесты показывают много кратное увеличение скорости скрипта.
-------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
![]() |
|
![]() ![]() Знатный быдлокодер ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 337 Пользователь №: 32761 На форуме: Карма: 19 ![]() |
Вместо eval(), лучше применить анонимную функцию.
|
![]() |
۩
Дата
|
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
xlebosol
Гм ... Интересная идея, как то их не использовал ни разу -------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
![]() |
۩
Дата
|
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
xlebosol
Нет не подойдет....это все равно вызовет многократное использование array_merge. -------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
![]() |
|
![]() Be prepared ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 5199 Пользователь №: 17723 На форуме: Карма: 57 ![]() |
eval = зло, но анонимку тут не применить насколько я вижу, поскольку кол-во массивов переменно.
ABC смотрите сами на то, как это отражается на быстродействии. Для сравнения было бы неплохо видеть и второй ваш вариант решения без eval. Как бы то ни было, если плохой eval оказывается здесь заметно быстрее необруганного array_merge (а быстродействие - то что всегда ставится в минус eval'у), то, очевидно, ругают не то. |
![]() |
|
![]() ![]() Знатный быдлокодер ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 337 Пользователь №: 32761 На форуме: Карма: 19 ![]() |
Тогда добро пожаловать в неизведанный мир итераторов (iteratorIterator, ArrayIterator) и т.д.. Что то array_merge не то мержит, в данном случае и без эвалов и array_merge можно обойтись.
|
![]() |
[x]
Дата
|
||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1867 Пользователь №: 20757 На форуме: Карма: 197 ![]() |
Вот по тестил. Все же eval немного быстрее (не значительно, так что можно пренебречь). За то второй вариант красивее ) function genArray($a = 10, $b = 10) результат
|
||
![]() |
۩
Дата
|
||||
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
+ За проделанную работу, но разница важна. $str[1][]=1; Вот здесь исходник статьи о которой я упомянул в начале поста, там результаты тестов: http://p2k.ru/archives/44 Может я устал уже за день и туго соображаю. Мне не понятно, как тут можно обойтись без этого: Я же объясняю использовать для сложения не затерев ключи можно только:array_merge Многократное использование array_merge тяжелее однократного. Для однократного нужно динамически перечислить массивы сделать это можно тогда когда array_merge вместе с аргументами будет просто строкой, а eval выполнит эту команду со стороны. -------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
||||
![]() |
|||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1867 Пользователь №: 20757 На форуме: Карма: 197 ![]() |
ABC , тот пост я удалил, по тому что код оказался не совсем рабочим, а точнее совсем не рабочим ;) .
постом выше предложил вариант с reflection $reflection = new ReflectionFunction('array_merge'); |
||
![]() |
۩
Дата
|
||
![]() ![]() TERRAFORMING ENGINEER ![]() ![]() ![]() ![]() ![]() ![]() Профиль Журнал Группа: ★ЛжеЭксперт★ ![]() Сообщений: 3900 Пользователь №: 21196 На форуме: Карма: 88 ![]() |
kaww Разве у тебя не применяется многократная инициализация array_merge? Все просто внутри класса происходит. Так ведь? Я не спорю, но в той статье ключевым помоему является вот эта правильная мысль:
-------------------- Не тот велик, кто не падал, а тот кто падал и поднимался.
|
||
![]() |
|
![]() ![]() Знатный быдлокодер ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 337 Пользователь №: 32761 На форуме: Карма: 19 ![]() |
<?php |
![]() |
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1867 Пользователь №: 20757 На форуме: Карма: 197 ![]() |
ABC
Как это происходит нужно спросить у разработчиков пхп http://www.php.net/manual/ru/class.reflectionfunction.php |
![]() |
![]() ![]() ![]() |