Возврат результатов, ЕСЛИ разделенные слова содержатся где-то в строке - PHP - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь вернуть все результаты из большого массива, содержащего «теги», предназначенные для поиска.

Надеюсь, я смогу ясно объяснить это, массив, в котором нужно выполнить поиск, выглядит следующим образом :

array(
    0 => 'DogCatSheepBlue WhaleShark',
    1 => 'CatPigGoatOtter',
    2 => 'ElephantTigerDogBlue WhaleGoat',
    3 => 'SeahorseSnakeGoatLion',
    ....
);

Есть поле ввода, в которое вы можете ввести свой поиск, поэтому, например, если вы введете Cat Whale, как я могу вернуть результаты 0 1 и 2 массива?

Когда в поле поиска вводится «пробел», эти слова следует рассматривать отдельно. Например, если вы искали GoatSeahorse, он не должен возвращать ни одного из приведенных выше результатов, даже если Goat и Seahorse технически оба содержатся в элементе массива 3.

Массив возвращается из запроса MySQL при загрузке страницы, и входные данные для поиска перенаправляются через jQuery AJAX на код PHP для создания нового отфильтрованного списка массивов, который затем передается обратно на страницу HTML .

Надеюсь, это имеет смысл - мы будем благодарны за любой совет. Я также был бы более чем счастлив услышать, есть ли более простой способ добиться этого, даже если он предполагает хранение массива или MySQL полей в другом формате.

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Один из способов сделать это - разделить входную строку на пробел, используя explode, а затем создать регулярное выражение из слов (отфильтрованных для удаления любых пустых строк, вызванных множественными пробелами во входных данных) , а затем фильтрация входного массива с использованием array_filter и preg_match:

function search($array, $search) {
    $words = explode(' ', $search);
    $regex = '/(' . implode('|', array_filter($words)) . ')/';
    return array_filter($array, function ($v) use ($regex) { return preg_match($regex, $v); });
}

Вы можете использовать такую ​​функцию:

$results = array(
    0 => 'DogCatSheepBlue WhaleShark',
    1 => 'CatPigGoatOtter',
    2 => 'ElephantTigerDogBlue WhaleGoat',
    3 => 'SeahorseSnakeGoatLion'
);
print_r(search($results, 'Cat    Whale'));
print_r(search($results, 'GoatSeahorse'));
print_r(search($results, 'Pig'));

Вывод:

Array
(
    [0] => DogCatSheepBlue WhaleShark
    [1] => CatPigGoatOtter
    [2] => ElephantTigerDogBlue WhaleGoat
)
Array
(
)
Array
(
    [1] => CatPigGoatOtter
)

Демо на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...