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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Рандомный выбор слова в строке.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
LML
Отправлено: 09 Октября, 2022 - 18:59:06
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




Для начала, чтобы было понятно, что мне нужно - покажу, что я сделал.

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

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. )


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

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


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

Как определить какой элемент массива сам является массивом, чтобы произвести из него выбор?
Как обратно собрать строку, если число вариантов выбора и, соответственно, элементов массива может быть любым?
Подскажите, пожалуйста, как сделать такой выбор при тех же условиях?
И, вообще, я правильно решаю эту задачу?
 
 Top
ALEN
Отправлено: 13 Октября, 2022 - 09:49:03
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку
 
 Top
LML
Отправлено: 07 Ноября, 2022 - 14:20:13
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




ALEN пишет:
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку


preg_replace_callback, действительно интересная функция. Но по ней что-то совсем мало информации, чтобы разобраться. Максимум, что у меня с ней получилось - это выбирать цвет.
Что-то я никак не могу понять, как правильно её применять.
Если можно - пожалуйста, приведите примеры, применительно к моему вопросу.
 
 Top
Vladimir Kheifets
Отправлено: 08 Ноября, 2022 - 18:08:16
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




LML пишет:
ALEN пишет:
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку


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


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



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




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 не будет ли лучше?
Хотелось бы с этой функцией тоже разобраться.
 
 Top
Vladimir Kheifets
Отправлено: 08 Ноября, 2022 - 21:29:52
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




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.
Переделки обходятся не дешево и многие не хотят за них платить.

(Отредактировано автором: 08 Ноября, 2022 - 21:30:45)

 
 Top
LML
Отправлено: 08 Ноября, 2022 - 21:46:23
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




Vladimir Kheifets пишет:
По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.


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

Как-то попробовал изменить файлы с mysql скриптом - легло всё Недовольство, огорчение
Больше и не пытаюсь.
 
 Top
Vladimir Kheifets
Отправлено: 09 Ноября, 2022 - 12:48:07
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




LML пишет:
Vladimir Kheifets пишет:
По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.


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

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


Добрый день!

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

(Отредактировано автором: 09 Ноября, 2022 - 12:54:09)

 
 Top
Vladimir Kheifets
Отправлено: 13 Ноября, 2022 - 07:35:47
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




(дополнение)

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

(Отредактировано автором: 13 Ноября, 2022 - 07:36:20)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB