使用 PHP 从类似于 SQL LIKE '%search%' 的数组中筛选值

2022-08-30 13:35:44

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

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


答案 1

您不需要使用自定义/ lambda函数,preg_grep可以做到这一点:array_filter

$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()