使用PHP过滤类似于SQL LIKE'%search%'的数组中的值

时间:2011-04-27 18:42:51

标签: php arrays

我使用JQueryUI创建了一个自动填充字段,并将我的数据存储在一个平面文档中。我可以将值读入数组......但我希望能够根据用户输入返回字母匹配。因此,如果数组包含[orange,blue,green,red,pink,brown,black]并且用户键入bl,那么我只返回[blue,black]

查看array_diff()但是没有完全匹配数组的整个值,我不确定如何使用它...可能是一个正则表达式?我的两个最弱的技能阵列操作和正则表达式感谢您的帮助!

3 个答案:

答案 0 :(得分:45)

您不需要使用array_filter和自定义/ lambda函数,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);

答案 1 :(得分:13)

带有基于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()

答案 2 :(得分:0)

您可以简单地遍历数组以查找以给定字母开头的所有字符串。将已排序的单词列表放在平面文件中可能会加快速度。我认为这很有效:

$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;
  }
}