Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Оптимизация конструкции (https://javascript.ru/forum/offtopic/24123-optimizaciya-konstrukcii.html)

greatilya 18.12.2011 13:51

Оптимизация конструкции
 
Добрый день!

Имеется следующая конструкция:
foreach($arr as $key=>$val) {
	$s=str_replace('lang['.$key.']', $val, $s);
}

Можно ли как-то оптимизировать? Возможно ли сделать подобное регуляркой?

melky 18.12.2011 19:59

либо массив $arr должен иметь ключи, уже с 'lang[$key]', и тогда можно будет решить проблемы вообще без использования цикла (в коде).

либо так это сделать (если у вас PHP < 5.3, то функцию нужно будет определить):

$s = strtr($s, array_map(function($key){ return 'lang['.$key.']';})  );


но будет ли это быстрее - вопрос :) не знаю, как у php со скоростью встроенных функций.

Gozar 18.12.2011 20:32

Цитата:

Сообщение от greatilya (Сообщение 144117)
Добрый день!

Имеется следующая конструкция:
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);

melky 18.12.2011 20:39

Цитата:

Сообщение от Gozar (Сообщение 144219)
Если нужно по скорости то возможно экономней будет str_replace кормить массивами, а не вызывать его в цикле.

у него один массив, где ключ - то, что надо заменить, а значение - то, на что заменить.

для этого же и нужна функция strtr

Gozar 18.12.2011 20:41

melky,
strtr нужна для работы со строками, а не с массивами.
Правду покажут только тесты.

melky 18.12.2011 20:42

может и с массивами. в этом случае мы надеемся на скорость встроенной функции.
пример 2 :
<?php
$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

Gozar 18.12.2011 20:46

$b = array('en'=>'английский','ru'=>'русский');
$a = array_keys($b);
echo str_replace($a,$b,'Этот ваш en язык, нужен для того, чтобы говорить по ru');

melky 18.12.2011 20:48

эх. похоже, это дело вкуса. не буду с пеной у рта доказывать, что использование встроенных функция вместо их обхода и написания доп. кода лучше.

зато у greatilya есть выбор!

Gozar 18.12.2011 20:50

melky,
Разве я предложил обход встроенных функций? Где? Да и потом, я предложил вариант, только после написанного тобой ранее, с array_map и function. С предложенным тобой последним вариантом я согласен.

greatilya 19.12.2011 06:25

Вечером ради интереса оценю скорость выполнения предложенных вариантов "в бою" в строке около мегабайта нужно сделать тысячи таких подстановок. И напишу о результатах. Спасибо за подсказки, я что-то и не вспомнил про strstr, хотя не раз использовал её для транслита :)


Часовой пояс GMT +3, время: 12:21.