Оптимизация конструкции
Добрый день!
Имеется следующая конструкция: foreach($arr as $key=>$val) { $s=str_replace('lang['.$key.']', $val, $s); } Можно ли как-то оптимизировать? Возможно ли сделать подобное регуляркой? |
либо массив $arr должен иметь ключи, уже с 'lang[$key]', и тогда можно будет решить проблемы вообще без использования цикла (в коде).
либо так это сделать (если у вас PHP < 5.3, то функцию нужно будет определить): $s = strtr($s, array_map(function($key){ return 'lang['.$key.']';}) ); но будет ли это быстрее - вопрос :) не знаю, как у php со скоростью встроенных функций. |
Цитата:
php.net: $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject); |
Цитата:
для этого же и нужна функция strtr |
melky,
strtr нужна для работы со строками, а не с массивами. Правду покажут только тесты. |
может и с массивами. в этом случае мы надеемся на скорость встроенной функции.
пример 2 : <?php $trans = array("hello" => "hi", "hi" => "hello"); echo strtr("hi all, I said hello", $trans); ?> |
$b = array('en'=>'английский','ru'=>'русский'); $a = array_keys($b); echo str_replace($a,$b,'Этот ваш en язык, нужен для того, чтобы говорить по ru'); |
эх. похоже, это дело вкуса. не буду с пеной у рта доказывать, что использование встроенных функция вместо их обхода и написания доп. кода лучше.
зато у greatilya есть выбор! |
melky,
Разве я предложил обход встроенных функций? Где? Да и потом, я предложил вариант, только после написанного тобой ранее, с array_map и function. С предложенным тобой последним вариантом я согласен. |
Вечером ради интереса оценю скорость выполнения предложенных вариантов "в бою" в строке около мегабайта нужно сделать тысячи таких подстановок. И напишу о результатах. Спасибо за подсказки, я что-то и не вспомнил про strstr, хотя не раз использовал её для транслита :)
|
Подвожу итоги сравнения двух функций в данной задаче:
1. strtr $trans = array("hello" => "hi", "hi" => "hello"); echo strtr("hi all, I said hello", $trans); Результат средний: ~0.53 секунды 2. str_replace $b = array('en'=>'английский','ru'=>'русский'); $a = array_keys($b); echo str_replace($a,$b,'Этот ваш en язык, нужен для того, чтобы говорить по ru'); Результат средний: ~40.81 секунды Различие на лицо. Напомню какие были исходные данные: строка размером порядка 1.5-2Мб в которую поставляется массив из 7282 элементов. |
greatilya,
А по отдельности что выдает: array_keys($b); и str_replace($a,$b,'Этот ваш en язык, нужен для того, чтобы говорить по ru');? Сейчас глянул более подробно и лучше так как я предложил не делать, дабы не получить инкрементальность, хотя я не знаю твоей задачи полностью, но все же. Это когда уже замененные фрагменты будут заменены на новые. Поэтому str_replace так долго работает. Если тест выдаст 40 секунд на str_replace, то значит строка прогоняется с заменой каждый раз на каждый ключ массива. |
Цитата:
Замерял только работу strtr и str_replace, всё другое по времени получалось достаточно быстро и для меня не критично. Цитата:
Цитата:
- имеется мультиязычный сайт, с -выбирая какие-то данные из БД, вместо строк подставляются лишь идентификаторы строк из таблицы LANG - после регуляркой мы выдираем из страницы все идентификаторы и делаем соответствующий запрос с таблице LANG, который наполняет наш массив с данными. - ну а после вставляем наши данные заменой на страницу - выводим страницу на экран |
вывод : в php, не как в js, есть смысл залать по справочникам (лучше держать вкладку с ним) и выискивать встроенные функции. со временем тот хренов список сам запомнится.
|
Цитата:
вывод : и в php, и в js, есть смысл ... |
Цитата:
у меня - "пустая болтовня", так скажем. как наткнусь - покажу. |
Часовой пояс GMT +3, время: 09:56. |