Фильтровать значения из массива, аналогичного SQL LIKE '% search%', используя PHP
Я создал поле автозаполнения с помощью JQueryUI, и я сохранил свои данные в плоском документе. Я могу читать значения в массиве... но я хотел бы иметь возможность возвращать алфавитные соответствия на основе ввода пользователя. Поэтому, если массив содержит [orange,blue,green,red,pink,brown,black]
, а пользовательский тип bl, то я возвращаю только [blue,black]
.
Глядя на array_diff()
, но без полных совпадений по всему значению массива, я не уверен, как его использовать... может быть, появилось регулярное выражение? Мои две самые слабые манипуляции с массивами и регулярное выражение Спасибо за помощь!
Ответы
Ответ 1
Вам не нужно использовать 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);
Ответ 2
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()
Ответ 3
Вы можете просто перебирать массив, чтобы искать все строки, начинающиеся с заданных букв. Наличие списка слов, уже отсортированных в вашем плоском файле, вероятно, ускорит процесс. Я думаю, что это работает очень хорошо:
$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;
}
}