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

Ecr*_*lis 29 php arrays

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

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

Ali*_*xel 49

你不需要使用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);
Run Code Online (Sandbox Code Playgroud)

  • @MichaelRopy:`$ result = preg_grep('〜^'.$ input.'〜',$ data);` (4认同)
  • 你的回答让我想到了'preg_grep()`.改变了'preg_filter()`并删除了'null`并且像魅力一样工作; 谢谢! (3认同)
  • @EmilioGort:当然,只需在最后一个`~`分隔符后添加一个`i`修饰符. (2认同)
  • 很好的答案.每当我搜索数组过滤器时谷歌中出现这个答案. (2认同)

Pas*_*TIN 13

array_filter(),基于的回调过滤功能stripos(),应该做的伎俩.


例如,如果输入存储在$input,并且您的数组存储在$data:

$input = 'bl';
$data = array('orange', 'blue', 'green', 'red', 'pink', 'brown', 'black');
Run Code Online (Sandbox Code Playgroud)

过滤只保留包含的单词$input (无论字符串中的哪个位置)都可以这样做:

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

var_dump($result);
Run Code Online (Sandbox Code Playgroud)

而且,在这里,你会得到:

array
  1 => string 'blue' (length=4)
  6 => string 'black' (length=5)
Run Code Online (Sandbox Code Playgroud)


更改过滤回调,您可以:

  • 测试字符串是否以输入开头 - 测试返回的值stripos()是否为=== 0
  • 使用区分大小写的匹配函数,例如 strpos()