Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.84.18.52] |
|
Сообщ.
#1
,
|
|
|
Добрый день!
Есть вот такой пример кода, который ищет в строке, все слова взятые из массива. Если все слова найдены, выдается результат True, если хотя бы одно слово не найдено, - False. <?php $keywords = array('apple', 'iphone-13', '128-gb', 'violett'); $string = '-apple-iphone-13-128-gb-violett-dual-sim-2764482'; echo 'String: '.$string."<br>"; // Подсчитаем, сколько всего ключевых слов в массиве $keywords_total = count($keywords); // Объявим переменную "keywords_find" $keywords_find = 0; // Перебираем массив, и ищем в строке каждое ключевое слово из массива foreach ($keywords as &$keyword) { // Если ключевое слово найдено в строке if (strpos($string, $keyword)) { // Увеличиваем на единицу переменную "keywords_find" $keywords_find++; echo 'Keyword: '.$keyword." (True)<br>"; } // Если ключевое слово не найдено в строке else { echo 'Keyword: '.$keyword." (False)<br>"; } } echo 'Total Keywords: '.$keywords_total."<br>"; echo 'Find Keywords: '.$keywords_find."<br>"; // Если количество найденных в строке ключевых слов, равно количеству // кличевых слов в массиве if ($keywords_find == $keywords_total) { echo 'Result: True<br>'; } // Если не равно else { echo 'Result: False<br>'; } ?> Результат: Цитата String: -apple-iphone-13-128-gb-violett-dual-sim-2764482 Keyword: apple (True) Keyword: iphone-13 (True) Keyword: 128-gb (True) Keyword: violett (True) Total Keywords: 4 Find Keywords: 4 Result: True Дело в том, что в заданной строке, название одного и того же цвета, может быть написано по разному, например: "violett" или "purple". (-apple-iphone-13-128-gb-purple-dual-sim-2764482) или (-apple-iphone-13-128-gb-violett-dual-sim-2764482) Объем памями тоже может быть указан в строке, как: "128-gb" или "128gb". Собственно сам вопрос, какие будут идеи, чтобы при проверки строки, можно было учесть все эти нюансы, чтобы добиться результата True? |
Сообщ.
#2
,
|
|
|
$string = str_replace(array("violett","128gb"), array("purple","128-gb"), "-apple-iphone-13-128-gb-violett-dual-sim-2764482"); |
Сообщ.
#3
,
|
|
|
Спасибо за Вашу идею! Наверное это самый простой вариант, привести все данные к единому виду.
|
Сообщ.
#4
,
|
|
|
Можно вместо массива вариантов строк - использовать регулярные выражения (собственно в которых и "зашиваются" варианты).
Плюс этого подхода в том, что одной проверкой можно оценить сразу весь список вариантов, без организации внутренних циклов. |
Сообщ.
#5
,
|
|
|
Спасибо за идею! Буду тоже пробовать, посмотрю потом, какой из вариантов будет удобней в работе.
|
Сообщ.
#6
,
|
|
|
Цитата Majestio @ Можно вместо массива вариантов строк - использовать регулярные выражения (собственно в которых и "зашиваются" варианты). Плюс этого подхода в том, что одной проверкой можно оценить сразу весь список вариантов, без организации внутренних циклов. Регулярное выражение не так удобно редактировать при наличии большого списка замен. А массивы можно легко загрузить хоть из файла, хоть из базы данных. А внутренних циклов надо посмотреть где ещё будет больше. Разбор регулярного выражения явно сложнее простого индексирования. |
Сообщ.
#7
,
|
|
|
Цитата macomics @ А внутренних циклов надо посмотреть где ещё будет больше. Разбор регулярного выражения явно сложнее простого индексирования. Вместо массива массивов строк замены - я предлагаю массив регулярок. Не думаю, что с массивом регулярок возникнут какие-то значимые сложности. |
Сообщ.
#8
,
|
|
|
Но на обработку регулярного выражения явно тратится больше времени, чем на сопоставление двух массивов по индексам.
|
Сообщ.
#9
,
|
|
|
Цитата macomics @ Но на обработку регулярного выражения явно тратится больше времени, чем на сопоставление двух массивов по индексам. Не всегда. Пример: -apple-iphone-13-128-gb-violett-dual-sim-<любое семизначное число> Тебе нужно предусмотреть 9+ млн "вариантов" и их перебрать в цикле. Регулярка это делает за раз. |
Сообщ.
#10
,
|
|
|
Цитата Majestio @ Не всегда. Пример: -apple-iphone-13-128-gb-violett-dual-sim-<любое семизначное число> Тебе нужно предусмотреть 9+ млн "вариантов" и их перебрать в цикле. Регулярка это делает за раз. С этим соглашусь, но это не может быть ключов в этой задаче т.к. это скорее уникальный идентификатор. Скорее подошло бы указание цвета в виде кода -apple-iphone-13-128-gb-#8A2BE2-dual-sim-2764482 -apple-iphone-13-128-gb-#9370DB-dual-sim-2764482 -apple-iphone-13-128-gb-#BA55D3-dual-sim-2764482 -apple-iphone-13-128-gb-#FF00FF-dual-sim-2764482 -apple-iphone-13-128-gb-#EE82EE-dual-sim-2764482 |