码:
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1"));
print_r(search($arr, 'name', 'cat 1'));
输出:
Array
(
[0] => Array
(
[id] => 1
[name] => cat 1
)
[1] => Array
(
[id] => 3
[name] => cat 1
)
)
如果效率很重要,则可以编写效率代码,以便所有递归调用将其结果存储在同一临时$results
数组中,而不是将数组合并在一起,如下所示:
function search($array, $key, $value)
{
$results = array();
search_r($array, $key, $value, $results);
return $results;
}
function search_r($array, $key, $value, &$results)
{
if (!is_array($array)) {
return;
}
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
search_r($subarray, $key, $value, $results);
}
}
这里的关键是search_r
通过引用而不是值来获取其第四个参数。“&”号&
至关重要。
仅供参考:如果您使用的是旧版PHP,则必须在的调用中search_r
而不是在其声明中指定引用传递部分。也就是说,最后一行变为search_r($subarray, $key, $value, &$results)
。
$key
数组中不存在错误的“高效”答案错误 ?会更好if (array_key_exists($key, $array) && $array[$key] == $value) {
吗?