【问题标题】:filter values from an array similar to SQL LIKE '%search%' using PHP使用 PHP 从类似于 SQL LIKE '%search%' 的数组中过滤值
【发布时间】:2011-08-14 02:45:15
【问题描述】:

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

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

【问题讨论】:

标签: php arrays


【解决方案1】:

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】:

您不需要使用 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);

【讨论】:

  • 你的回答把我带到了preg_grep()。将preg_filter() 更改为那个并删除null 并像魅力一样工作;谢谢!
  • @Ecropolis:我认为在这种情况下正确的语法是preg_filter('~' . $input . '~', '$0', $data);
  • @EmilioGort:当然,只需在最后一个 ~ 分隔符之后添加一个 i 修饰符。
  • @MichaelRopy: $result = preg_grep('~^' . $input . '~', $data);
  • 很好的答案。每次当我搜索数组过滤器时,谷歌都会出现这个答案。
【解决方案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;
  }
}

【讨论】:

    【解决方案4】:

    喜欢 %search%

    function like(array $arr, string $patron): array
        {
            return array_filter($arr, static function (mixed $value) use ($patron): bool {
                return 1 === preg_match(sprintf('/^%s$/i', preg_replace('/(^%)|(%$)/', '.*', $patron)), $value);
            });
        }
    

    测试

    $b=['a'=>'peter','b'=>'patter','c'=>'alter','d'=>'all'];
    var_dump(like($b,'%ter'));// ['a'=>'peter','b'=>'patter','c'=>'alter']
    var_dump(like($b,'al%'));//['c'=>'alter','d'=>'all']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-04
      • 2015-12-19
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多