фильтровать значения из массива, аналогичного SQL LIKE '% search%', используя PHP

Я создал поле автозаполнения с помощью JQueryUI, и я сохранил свои данные в плоском документе. Я могу читать значения в массиве … но я хотел бы иметь возможность возвращать алфавитные соответствия на основе ввода пользователя. Поэтому, если массив содержит [orange,blue,green,red,pink,brown,black] и пользовательские типы bl, то я возвращаю только [blue,black] .

Глядя на array_diff() но без полных совпадений по всему значению массива, я не уверен, как его использовать … может быть, вы выбрали регулярное выражение? Мои две самые слабые манипуляции с массивами и регулярное выражение Спасибо за помощь!

Вам не нужно использовать array_filter и пользовательскую / лямбда-функцию, preg_grep делает трюк:

 $input = preg_quote('bl', '~'); // don't forget to quote input string! $data = array('orange', 'blue', 'green', 'red', 'pink', 'brown', 'black'); $result = preg_grep('~' . $input . '~', $data); 

array_filter() , с функцией фильтрации обратного вызова, основанной на stripos() , должен сделать трюк.

Например, если вход хранится в $input и ваш массив в $data :

 $input = 'bl'; $data = array('orange', 'blue', 'green', 'red', 'pink', 'brown', 'black'); 

Фильтрация, чтобы сохранить только слова, содержащие $input (независимо от того, где в строке), можно сделать так:

 $result = array_filter($data, function ($item) use ($input) { if (stripos($item, $input) !== false) { return true; } return false; }); var_dump($result); 

И здесь вы получите:

 array 1 => string 'blue' (length=4) 6 => string 'black' (length=5) 

Изменяя обратный вызов фильтрации, вы можете:

  • Проверьте, начинается ли строка с ввода – тестирование, если значение, возвращаемое stripos() равно === 0
  • Используйте функцию сопоставления с учетом регистра, например strpos()

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

 $input = strtolower("bl"); //from the user $colors = array("black", "blue", "brown", "..."); //already sorted alphabetically $matches = array(); foreach ($colors as $c){ if (strpos($c, $input) === 0){ //if $c starts with $input, add to matches list $matches[] = $c; } else if (strcmp($input, $c) < 0){ //$input comes after $c in alpha order //since $colors is sorted, we know that we won't find any more matches break; } }