Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Рандомный выбор слова в строке.
Форумы портала PHP.SU » » Вопросы новичков » Рандомный выбор слова в строке.

Страниц (1): [1]
 

1. LML - 09 Октября, 2022 - 18:59:06 - перейти к сообщению
Для начала, чтобы было понятно, что мне нужно - покажу, что я сделал.

Допустим, имеется строка: Железнодорожный семафор имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.
Мне нужно получить строку с одним рандомным цветом, либо исходную строку, если в ней нет вариантов выбора.
Я делаю так:

PHP:
скопировать код в буфер обмена
  1. $str = 'Железнодорожный семафор имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.';
  2. //$str = 'Светофор отключён.';
  3.  
  4. if (strpos($str, '{') !== false) {
  5. $str = preg_split( "/[\{\}]/", $str);
  6. print_r ($str).PHP_EOL;
  7. $exp = explode('|', $str[1]);
  8. echo $str[0].$exp[mt_rand(0, count($exp)-1)].$str[2];
  9. } else {
  10. echo $str;
  11. }


Получается всё красиво:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Железнодорожный семафор имеет
  3.     [1] => красный|жёлтый|зелёный|синий|белый
  4.     [2] =>  свет свечения.
  5. )


Цитата:
Железнодорожный семафор имеет жёлтый свет свечения.


А теперь мне нужно сделать выбор из двух (или более) массивов: Железнодорожный {светофор|семафор} имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.

Я теперь получаю массив:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Железнодорожный
  3.     [1] => светофор|семафор
  4.     [2] =>  имеет
  5.     [3] => красный|жёлтый|зелёный|синий|белый
  6.     [4] =>  свет свечения.
  7. )


И, в результате, не то что нужно Недовольство, огорчение

Цитата:
Железнодорожный семафор имеет


Вот тут я запутался.

Как определить какой элемент массива сам является массивом, чтобы произвести из него выбор?
Как обратно собрать строку, если число вариантов выбора и, соответственно, элементов массива может быть любым?
Подскажите, пожалуйста, как сделать такой выбор при тех же условиях?
И, вообще, я правильно решаю эту задачу?
2. ALEN - 13 Октября, 2022 - 09:49:03 - перейти к сообщению
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку
3. LML - 07 Ноября, 2022 - 14:20:13 - перейти к сообщению
ALEN пишет:
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку


preg_replace_callback, действительно интересная функция. Но по ней что-то совсем мало информации, чтобы разобраться. Максимум, что у меня с ней получилось - это выбирать цвет.
Что-то я никак не могу понять, как правильно её применять.
Если можно - пожалуйста, приведите примеры, применительно к моему вопросу.
4. Vladimir Kheifets - 08 Ноября, 2022 - 18:08:16 - перейти к сообщению
LML пишет:
ALEN пишет:
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку


preg_replace_callback, действительно интересная функция. Но по ней что-то совсем мало информации, чтобы разобраться. Максимум, что у меня с ней получилось - это выбирать цвет.
Что-то я никак не могу понять, как правильно её применять.
Если можно - пожалуйста, приведите примеры, применительно к моему вопросу.


Добрый день!
Верно, регуляркой не нужно (более дорогая), только вот функция preg_replace_callback это тоже регулярка. Попробуйте так (проверял на PHP 8.1)
Спойлер (Отобразить)
Удачи!
5. LML - 08 Ноября, 2022 - 20:25:59 - перейти к сообщению
Vladimir Kheifets пишет:

Добрый день!
Верно, регуляркой не нужно (более дорогая), только вот функция preg_replace_callback это тоже регулярка. Попробуйте так (проверял на PHP 8.1) Удачи!


Спасибо Вам огромное!

Но на PHP 5.6, видимо, без регулярок не обойтись.

Пришлось заменить

на
PHP:
скопировать код в буфер обмена
  1. $buf = preg_split("//u", $inStr, null, PREG_SPLIT_NO_EMPTY);


И всё же, на preg_replace_callback не будет ли лучше?
Хотелось бы с этой функцией тоже разобраться.
6. Vladimir Kheifets - 08 Ноября, 2022 - 21:29:52 - перейти к сообщению
LML пишет:
Vladimir Kheifets пишет:

Добрый день!
Верно, регуляркой не нужно (более дорогая), только вот функция preg_replace_callback это тоже регулярка. Попробуйте так (проверял на PHP 8.1) Удачи!


Спасибо Вам огромное!

Но на PHP 5.6, видимо, без регулярок не обойтись.

Пришлось заменить

на
PHP:
скопировать код в буфер обмена
  1. $buf = preg_split("//u", $inStr, null, PREG_SPLIT_NO_EMPTY);


И всё же, на preg_replace_callback не будет ли лучше?
Хотелось бы с этой функцией тоже разобраться.

По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.
7. LML - 08 Ноября, 2022 - 21:46:23 - перейти к сообщению
Vladimir Kheifets пишет:
По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.


Полностью с Вами согласен. Но.
То, что я делаю - это больше для себя. Скажем так - практические работы по самообразованию.
За этот проект мне никто ничего не платит, а плачу я сам за сервер.
Ну и самое главное, перевести проект даже на версию выше 5.6 - проблема из-за необходимости переписывать десятки (может даже сотни) обращений к базе из разных файлов. Вручную - это просто не стоит затраченного времени.

Как-то попробовал изменить файлы с mysql скриптом - легло всё Недовольство, огорчение
Больше и не пытаюсь.
8. Vladimir Kheifets - 09 Ноября, 2022 - 12:48:07 - перейти к сообщению
LML пишет:
Vladimir Kheifets пишет:
По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.


Полностью с Вами согласен. Но.
То, что я делаю - это больше для себя. Скажем так - практические работы по самообразованию.
За этот проект мне никто ничего не платит, а плачу я сам за сервер.
Ну и самое главное, перевести проект даже на версию выше 5.6 - проблема из-за необходимости переписывать десятки (может даже сотни) обращений к базе из разных файлов. Вручную - это просто не стоит затраченного времени.

Как-то попробовал изменить файлы с mysql скриптом - легло всё Недовольство, огорчение
Больше и не пытаюсь.


Добрый день!

Относительно сервера для обучения и каких-нибудь экспериментов.
Советую Вам установить на своём компе локальный сервер, например https://ospanel[dot]io/
Вы можете изменять конфигурацию сервера и тестировать свои скрипты на разных версиях PHP и MySQL и.т.п
По Вашей задаче.
Я переписал свой скрип так, чтобы он работал на PHP начиная 5.4 и до 8.1 без регулярок.
Спойлер (Отобразить)
Удачи!
9. Vladimir Kheifets - 13 Ноября, 2022 - 07:35:47 - перейти к сообщению
(дополнение)

Добавлен контроль синтаксиса
Спойлер (Отобразить)
Удачи!

 

Powered by ExBB FM 1.0 RC1