Сегодня я хочу рассказать о крутой функции, которую я сделал для тестового задания в одну компанию. Задача была следующей:
Для начала, напишем функцию, которая будет искать последнее вхождение символа в строку. Для этого перебираем каждый символ в ней, ищем совпадение и возвращаем позицию символа в строке:
Далее вводим саму строку:
Я ее немного усложнил, добавив больше вложенности.
Ну а теперь напишем сам вывод.
Этот код проходит по всей строке $str и заменяет слова в скобках на один из вариантов находящихся в ней.
Где это можно применить? Допустим, чтобы разнообразить приветствие на сайте, вы пишите не просто «Привет», а несколько вариантов: «{Привет|Добро пожаловать {к нам|на наш сайт|в наш дом}}» и так далее. Тогда, каждый раз пользователь будет видеть разное приветствие. Конечно, использовать эту функцию можно с любой другой целью, но будьте внимательны — смысл предложения не должен поменяться. Следите за тем, что слова правильно связанны и что в любом из вариантов будут иметь правильный смысл. Пользуйтесь :)
Сделать на PHP программу, которая бы для строки вида
$str = "{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
выдавала все возможные варианты (вложенность скобок не ограничена) за один запуск.
Для начала, напишем функцию, которая будет искать последнее вхождение символа в строку. Для этого перебираем каждый символ в ней, ищем совпадение и возвращаем позицию символа в строке:
function StrCharPosBack($haystack, $needle) {// ищет последнее вхождение символа
for ($i = strlen($haystack) ; $i>=0 ; $i--){
if (substr($haystack, $i, 1) === $needle)
return $i;
}
return false;
}
Далее вводим саму строку:
$str = '{Пожалуйста,|Просто} {постарайтесь сделать|сделайте} так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз|постоянно {изменялось|менялось} при {каждом {новом|повторном {и {невероятном|удивительном|очень {симпатичном|необычном}}}}} обновлении страницы}';
Я ее немного усложнил, добавив больше вложенности.
Ну а теперь напишем сам вывод.
while (strpos($str, "{") !== false){
$pos1 = strpos($str, "}");
$buf_mas = substr($str, 0, $pos1);
$pos2 = StrCharPosBack ($buf_mas, "{");
$buf_mas = substr($buf_mas, $pos2+1);
$exploded_buf_mas = explode ("|", $buf_mas);
$rnd = rand(0, count($exploded_buf_mas)-1);
$str = substr_replace($str, $exploded_buf_mas[$rnd], $pos2, $pos1+1-$pos2);
}
echo $str;
Этот код проходит по всей строке $str и заменяет слова в скобках на один из вариантов находящихся в ней.
Где это можно применить? Допустим, чтобы разнообразить приветствие на сайте, вы пишите не просто «Привет», а несколько вариантов: «{Привет|Добро пожаловать {к нам|на наш сайт|в наш дом}}» и так далее. Тогда, каждый раз пользователь будет видеть разное приветствие. Конечно, использовать эту функцию можно с любой другой целью, но будьте внимательны — смысл предложения не должен поменяться. Следите за тем, что слова правильно связанны и что в любом из вариантов будут иметь правильный смысл. Пользуйтесь :)