数组:
$userdb = array(
array(
'uid' => '100',
'name' => 'Sandra Shush',
'pic_square' => 'abc.jpg'
),
array(
'uid' => '5465',
'name' => 'Stefanie Mcmohn',
'pic_square' => 'Michael.jpg'
),
array(
'uid' => '40489',
'name' => 'Michael',
'pic_square' => 'xyz.jpg'
)
);
搜索值:
迈克尔
预期产出:
$userdb = array(
array(
'uid' => '5465',
'name' => 'Stefanie Mcmohn',
'pic_square' => 'Michael.jpg'
),
array(
'uid' => '40489',
'name' => 'Michael',
'pic_square' => 'xyz.jpg'
)
);
您可以查看我想要的内容,请告诉我如何使用PHP实现此结果。我不关心我的搜索词是否在'uid','name'或'pic_square'键中,但是每当我的搜索词结果匹配时我想得到数组。是否有任何可以实现此结果的内置功能?
答案 0 :(得分:3)
另一种方法是使用array_filter()
删除与您的搜索不匹配的元素。
$userdb = array(
array('uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'abc.jpg'),
array('uid' => '5465', 'name' => 'Stefanie Mcmohn', 'pic_square' => 'Michael.jpg'),
array('uid' => '40489', 'name' => 'Michael', 'pic_square' => 'xyz.jpg')
);
$search = 'Michael';
$out = array_filter($userdb, function($item) use($search) {
return $item['name'] == $search || strpos($item['pic_square'], $search) !== false;
});
print_r($out);
输出:
Array (
[1] => Array (
[uid] => 5465
[name] => Stefanie Mcmohn
[pic_square] => Michael.jpg
)
[2] => Array (
[uid] => 40489
[name] => Michael
[pic_square] => xyz.jpg
)
)
答案 1 :(得分:1)
非常简单的解决方案 ,可以将简单的foreach()
应用于strpos()
1.使用foreach()
2.检查三个id, name,pic_square
中的任何一个是否存在搜索值?如果是,则将整个子数组添加到新数组中。
3.这个新阵列是您想要的结果。
$search_value = 'Michael';
$final_array = [];
foreach($userdb as $userd){
if(strpos($userd['uid'],$search_value)!== false || strpos($userd['name'],$search_value)!== false || strpos($userd['pic_square'],$search_value)!== false){
$final_array[] = $userd;
}
}
print_r($final_array);
输出: - https://eval.in/997896
答案 2 :(得分:1)
您可以使用preg_grep来匹配松散比较中的搜索。
$search = "Michael";
Foreach($userdb as $key => $arr){
If(preg_grep("/" . $search ."/", $arr)){
$res[] = $userdb[$key];
}
}
Var_dump($res);
我循环遍历数组,如果与preg_grep匹配,则将其添加到结果数组中。
Preg_grep将搜索整个数组,而不仅仅是硬编码的项目 这显然是好事和坏事。
例如,如果您的数据库扩展为'别名' key preg_grep将搜索它而无需更改代码。
见这里的例子:
https://3v4l.org/lOao3
答案 3 :(得分:0)
这应该可以解决问题。
foreach($userdb as $i=>$r){
foreach($r as $j=>$v){
#if($v matches the querystring)
#return $r / append $r to a match list
}
}
但注意,因为没有索引和全部,这将在 O(N ^ 2)中运行,这是最糟糕的情况......
编辑
经过一番研究,提出了以下解决方案。
$userdb = array(
array(
'uid' => '100',
'name' => 'Sandra Shush',
'pic_square' => 'abc.jpg'
),
array(
'uid' => '5465',
'name' => 'Stefanie Mcmohn',
'pic_square' => 'Michael.jpg'
),
array(
'uid' => '40489',
'name' => 'Michael',
'pic_square' => 'xyz.jpg'
)
);
$search = "Michael";
$out = array_filter($userdb, function($item) use($search) {
foreach($item as $k=>$v){
if(preg_match("/$search/", $v) == 1){
return true;
}
}
});
echo json_encode($out);
解决方案使用array_filter
函数(Syscall's answer在此得到承认,这是我进一步研究array_filter
的指针)以使用过滤器减少数组,其中过滤器是在关联数组元素的每个属性上执行preg_match
。如果找到匹配项,则返回true,这会将匹配元素添加到$out
。