18.12.2011, 13:51
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Оптимизация конструкции
Добрый день!
Имеется следующая конструкция:
foreach($arr as $key=>$val) {
$s=str_replace('lang['.$key.']', $val, $s);
}
Можно ли как-то оптимизировать? Возможно ли сделать подобное регуляркой?
|
|
18.12.2011, 19:59
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
либо массив $arr должен иметь ключи, уже с 'lang[$key]', и тогда можно будет решить проблемы вообще без использования цикла (в коде).
либо так это сделать (если у вас PHP < 5.3, то функцию нужно будет определить):
$s = strtr($s, array_map(function($key){ return 'lang['.$key.']';}) );
но будет ли это быстрее - вопрос не знаю, как у php со скоростью встроенных функций.
|
|
18.12.2011, 20:32
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от greatilya
|
Добрый день!
Имеется следующая конструкция:
foreach($arr as $key=>$val) {
$s=str_replace('lang['.$key.']', $val, $s);
}
Можно ли как-то оптимизировать? Возможно ли сделать подобное регуляркой?
|
Если нужно по скорости то возможно экономней будет str_replace кормить массивами, а не вызывать его в цикле.
php.net:
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
18.12.2011, 20:39
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Gozar
|
Если нужно по скорости то возможно экономней будет str_replace кормить массивами, а не вызывать его в цикле.
|
у него один массив, где ключ - то, что надо заменить, а значение - то, на что заменить.
для этого же и нужна функция strtr
|
|
18.12.2011, 20:41
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
melky,
strtr нужна для работы со строками, а не с массивами.
Правду покажут только тесты.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
18.12.2011, 20:42
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
может и с массивами. в этом случае мы надеемся на скорость встроенной функции.
пример 2 :
<?php
$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>
|
|
18.12.2011, 20:46
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
$b = array('en'=>'английский','ru'=>'русский');
$a = array_keys($b);
echo str_replace($a,$b,'Этот ваш en язык, нужен для того, чтобы говорить по ru');
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
18.12.2011, 20:48
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
эх. похоже, это дело вкуса. не буду с пеной у рта доказывать, что использование встроенных функция вместо их обхода и написания доп. кода лучше.
зато у greatilya есть выбор!
|
|
18.12.2011, 20:50
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
melky,
Разве я предложил обход встроенных функций? Где? Да и потом, я предложил вариант, только после написанного тобой ранее, с array_map и function. С предложенным тобой последним вариантом я согласен.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 18.12.2011 в 21:05.
|
|
19.12.2011, 06:25
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Вечером ради интереса оценю скорость выполнения предложенных вариантов "в бою" в строке около мегабайта нужно сделать тысячи таких подстановок. И напишу о результатах. Спасибо за подсказки, я что-то и не вспомнил про strstr, хотя не раз использовал её для транслита
|
|
|
|