PHP - Заменить эллементы строки на эллементы массива

123
S
На сайте с 13.10.2014
Offline
171
#11
Joker-jar:
прогрел процессор

поменял местами. Время не изменилось.

время выполнения 2 0.19799995422363 секунд
время выполнения 1 0.90075397491455 секунд

прихожу к выводу, что strtr просто медленная функция.

S
На сайте с 30.09.2016
Offline
469
#12
silicoid:
Прикол

Никакого прикола. Краткость кода не связана со скоростью его исполнения. На ассемблере:) код получается многократно длиннее, но работать он будет быстрее.

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

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
SN
На сайте с 04.07.2013
Offline
84
#13
silicoid:
Прикол.
Вариант с foreach и str_replace работает в 5 раз быстрее, чем strtr

Спасибо!

Я скопировал ваш код и вот мои результаты:

время выполнения 1 0.28654098510742 секунд

время выполнения 2 0.8086371421814 секунд

Поменял местами:

время выполнения 2 0.81029081344604 секунд

время выполнения 1 0.25031208992004 секунд

Интересно, почему у нас с вами такая разница?

---------- Добавлено 06.04.2017 в 17:31 ----------

Joker-jar:
Потому что надо передавать одним параметрам ключи, а другим - значения. Если имеем в распоряжении массив как в стартпосте.

Я правильно понимаю что можно это сделать с помощью функции str_replace без использования цикла?

Никак не соображу что нужно сделать. Конечно хотелось бы наиболее производительный код..

Вот что у меня получается:

$text ="текст [45] текст [78] текст [31] текст [19] текст";

$array1 = array(

1 => "[45]",

2 => "[78]",

3 => "[31]",

4 => "[19]",

);

$array2 = array(

19 => "<img src=\"19.jpg\">",

24 => "<img src=\"24.jpg\">",

45 => "<img src=\"45.jpg\">",

78 => "<img src=\"78.jpg\">",

);

$newphrase = str_replace($array1, $array2, $text);

echo $newphrase;

результат:

текст <img src="19.jpg"> текст <img src="24.jpg"> текст <img src="45.jpg"> текст <img src="78.jpg"> текст

---------- Добавлено 06.04.2017 в 17:33 ----------

Sitealert:
А чем str_replace не устраивает? Этот вариант работает с Вашим исходным массивом.

Не устраивает только одном: я никак не соображу как с помощью него это сделать!

S
На сайте с 30.09.2016
Offline
469
#14
SeoNk:
почему у нас с вами такая разница?

Кстати, я тоже попробовал, и получается как-то по-разному от раза к разу, причём, похоже, результат ещё и от версии PHP зависит.

SN
На сайте с 04.07.2013
Offline
84
#15

Одну минуту..

Я правильно понимаю что мы в тесте заставляем выполняться этот код 100 000 раз и это занимает меньше секунды?

Если это так, то мне кажется такая нагрузка вообще пренибрежимо мала (скрип будет выполняться 1 раз при запросе) и тут особо нет разницы что использовать

S
На сайте с 30.09.2016
Offline
469
#16
SeoNk:
Не устраивает только одном: я никак не соображу как с помощью него это сделать!

Так Вам ещё вчера, почти сразу же дали решение, надо было его только прочитать и использовать

$text ="текст [45] текст [78] текст [31] текст [19] текст";


$array = array(
19 => "<img src='19.jpg'>",
24 => "<img src='24.jpg'>",
45 => "<img src='45.jpg'>",
78 => "<img src='78.jpg'>",
);


foreach($array as $key => $value){
$text = str_replace ("[$key]",$value,$text);
}

echo $text;
SN
На сайте с 04.07.2013
Offline
84
#17
Sitealert:
Так Вам ещё вчера, почти сразу же дали решение, надо было его только прочитать и использовать
$text ="текст [45] текст [78] текст [31] текст [19] текст";


$array = array(
19 => "<img src='19.jpg'>",
24 => "<img src='24.jpg'>",
45 => "<img src='45.jpg'>",
78 => "<img src='78.jpg'>",
);


foreach($array as $key => $value){
$text = str_replace ("[$key]",$value,$text);
}

echo $text;

аа. я думал можно как то без цикла обойтись. теперь понятно, спасибо

S
На сайте с 30.09.2016
Offline
469
#18
SeoNk:
такая нагрузка вообще пренибрежимо мала (скрип будет выполняться 1 раз при запросе) и тут особо нет разницы что использовать

Вы угадали, это в данном случае сугубо теоретический вопрос, имеющий значение при большом объёме кода и большой частоте запросов.

mendel
На сайте с 06.03.2008
Offline
183
#19
SeoNk:
аа. я думал можно как то без цикла обойтись. теперь понятно, спасибо

Обойтись можно, но не факт что нужно :)

Если скобки запихнуть сразу в наш массив замен, то можно что-то вроде такого сделать:


$text ="текст [45] текст [78] текст [31] текст [19] текст";

$array = [ "[19]" => "<img src='19.jpg'>",
"[24]" => "<img src='24.jpg'>",
"[45]" => "<img src='45.jpg'>",
"[78]" => "<img src='78.jpg'>",
];

$text = str_replace(array_keys($array), array_values($array), $text);
echo $text;

Но так мы поставим Милторга в состояние суперпозиции.

С одной стороны нестрогое соблюдение условий, а надо даже баги воспроизводить. С другой стороны - ну меньше букофф и сложнее понять как работает!

Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
S
На сайте с 13.10.2014
Offline
171
#20
SeoNk:
Интересно, почему у нас с вами такая разница?

Действительно. Очень интересно.

Я все это удовольствие крутил на php 5.4.16 в режиме cgi, так как это выделенный сервер для разработки.

Sitealert:
похоже, результат ещё и от версии PHP зависит

Очень похоже.

Я еще попробовал использовать вариант с array_walk - но с ним получается как-то совсем долго и весьма ректально, хотя Вызов пользовательской функции процесс не быстрый. (правда, начиная с 5.3 и не медленный) но чтоб в простых функциях результат отличался в разы, причем в зависимости от сервера в ту или иную сторону. Вот что странно

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий