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
注意:搜索应该是键或值
$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)
也就是说,如果您想要搜索键和值两者,如果您只想搜索值,请删除键部分.
这是一个preg_grep应该更像WHERE REGEXP 'PATTERN'MySQL中的解决方案.我修改了Daniel Klein的preg_grep_keys函数来搜索数组键中的模式,并添加了一个array_merge,它应该与带有非数字键的数组一起使用.如果键是数字键,只需使用纯粹的preg_grep解决方案(preg_grep('~Mark~i', $arr);找到所有具有mark或Mark等的数组元素).
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)