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

12 3
SN
На сайте с 04.07.2013
Offline
84
1945

Есть такая переменная с текстом:

$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'>",

)

Необходимо заменить числа в квадратных скобках на соответствующие эллементы массива.

Т.е. в результате мне нужно получить строку:

$text ="текст <img src='45.jpg'> текст <img src='78.jpg'> текст [31] текст <img src='19.jpg'> текст";

Подскажите в каком направлении копать! Мозг кипит!

PS Прошу обратить внимание что в примере только три соответствия и они идут непоследовательно

LEOnidUKG
На сайте с 25.11.2006
Online
1724
#1

Чем обычный цикл не подошёл? Хоть for, хоть foreach

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Оптимизайка
На сайте с 11.03.2012
Offline
396
#2
SeoNk:
Подскажите в каком направлении копать! Мозг кипит!

http://php.net/manual/en/function.strtr.php

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
S
На сайте с 13.10.2014
Offline
171
#3

как-то так


foreach($array as $key => $value){
$text = str_replace ($key,$value,$text);
}
S
На сайте с 30.09.2016
Offline
469
#4

("[$key]",$value,$text)

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Joker-jar
На сайте с 26.08.2010
Offline
154
#5

Да даже str_replace позволяет:

Если search или replace являются массивами, их элементы будут обработаны от первого к последнему.
SN
На сайте с 04.07.2013
Offline
84
#6
Joker-jar:
Да даже str_replace позволяет:

"их элементы будут обработаны от первого к последнему." - не годится. Вот результат работы скрипта: текст <img src="19.jpg"> текст <img src="24.jpg"> текст <img src="45.jpg"> текст <img src="78.jpg"> текст

Т.е. он втупую последовательно поменял значения.

---------- Добавлено 06.04.2017 в 09:19 ----------

Супер!

$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\">",

);

$newphrase = strtr($text, $array);

echo $newphrase;

Результат:

текст <img src="45.jpg"> текст <img src="78.jpg"> текст [31] текст <img src="19.jpg"> текст

Спасибо!

Осталось сообразить как создать такой массив..

Joker-jar
На сайте с 26.08.2010
Offline
154
#7
не годится

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

S
На сайте с 30.09.2016
Offline
469
#8
SeoNk:
Осталось сообразить как создать такой массив..

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

S
На сайте с 13.10.2014
Offline
171
#9

Прикол.

Вариант с foreach и str_replace работает в 5 раз быстрее, чем strtr

3 раза пересмотрел код.

ответ одинаковый

ЧЯДНТ


$text_2 = "текст [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\">",
);

//var 1
$time_start = microtime(true);
for ($i=0;$i<100000;$i++)
{
$text = $text_2;
$text = strtr($text, $array);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "время выполнения 1 $time секунд\n <br/><br/>";



//var2
$time_start = microtime(true);
for ($i=0;$i<100000;$i++)
{
$text = $text_2;
foreach($array as $key => $value)
{
$text = str_replace ($key,$value,$text);
}
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "время выполнения 2 $time секунд\n <br/>";

100к итераций


время выполнения 1 0.93798995018005 секунд
время выполнения 2 0.18676710128784 секунд
Joker-jar
На сайте с 26.08.2010
Offline
154
#10

Ну так ты первым методом прогрел процессор, конечно второй код быстрее начнет выполняться.

12 3

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