фильтровать значения из массива, аналогичного SQL LIKE "% search%", используя PHP - PullRequest
29 голосов
/ 27 апреля 2011

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

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

Ответы [ 3 ]

48 голосов
/ 27 апреля 2011

Вам не нужно использовать 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);
13 голосов
/ 27 апреля 2011

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()
0 голосов
/ 28 апреля 2011

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

$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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...