如何在PHP数组中搜索,类似于MySQL Like%var%search

Qaz*_*azi 7 php regex arrays search filtering

是否可以像在MySQL中一样在PHP数组中进行搜索.

例如:我有这个 array

array(
  'mark@test.com'=> `Mark Mian`,
  'jhon@test.com'=> `John jack`,
  'logon@test.com'=> `Bob Logon`,
  'Stela@test.com'=> `Stela Josh`,
  'json@test.com'=> `Json Josh`
  'bobby@test.com'=> `Bob Mark`
)
Run Code Online (Sandbox Code Playgroud)

我会做这种搜索,

例如:如果我搜索Mark它应该给我这个

'mark@test.com'=>`马克勉

如果我搜索Bob它应该返回我

'bobby@test.com'=> Bob Mark

'logon@test.com'=> Bob Logon,

如果我只搜索a它应该返回那些包含a例如:

'mark@test.com'=> Mark Mian,

'jhon@test.com'=> John jack,

'Stela@test.com'=> Stela Josh,

'bobby@test.com'=> Bob Mark

注意:搜索应该是键或值

Han*_*nky 7

$needle="bob";
$output=array();
foreach($array as $k=>$v)
{
   if(stristr($k,$needle) || stristr($v,$needle))
   $output[$k]=$v;
}
print_r($output);
Run Code Online (Sandbox Code Playgroud)

小提琴

也就是说,如果您想要搜索键和值两者,如果您只想搜索值,请删除部分.


Wik*_*żew 6

这是一个preg_grep应该更像WHERE REGEXP 'PATTERN'MySQL中的解决方案.我修改了Daniel Klein的preg_grep_keys函数来搜索数组键中的模式,并添加了一个array_merge,它应该与带有非数字键的数组一起使用.如果键是数字键,只需使用纯粹的preg_grep解决方案(preg_grep('~Mark~i', $arr);找到所有具有markMark等的数组元素).

array_merge
将一个或多个数组的元素合并在一起,以便将一个值的值附加到前一个数组的末尾.它返回结果数组. 如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键.但是,如果数组包含数字键,则后面的值不会覆盖原始值,但会附加.

function preg_grep_keys_values($pattern, $input, $flags = 0) {
    return array_merge(
      array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags))),
      preg_grep($pattern, $input, $flags)
   );
}

$a = array(
  'mark@test.by.com'=> "Mark Mian lv",
  'jhon@test.lv.com'=> "John jack lv",
  'logon@test.en.com'=> "Bob Logon",
  'Stela@test.es.com'=> "Stela Josh",
  'json@test.es.com'=> "Json Josh",
  'bobby@test.lv.com'=> "Bob Mark"
);

$r = preg_grep_keys_values('~lv~i', $a);
print_r($r);
Run Code Online (Sandbox Code Playgroud)

请参阅此IDEONE演示

上面的代码首先lv在键中搜索(不区分大小写),然后在值中搜索,然后将结果合并到1个数组中.因此,结果是:

[jhon@test.lv.com] => John jack lv
[bobby@test.lv.com] => Bob Mark
[mark@test.by.com] => Mark Mian lv
Run Code Online (Sandbox Code Playgroud)