如何在PHP多维数组中按key=>value搜索

如何在PHP多维数组中按key=>value搜索

在多维数组中找到键值对的所有子数组有任何快速获取方法吗?我不能说数组有多深。

简单示例数组:

$arr = array(0 => array(id=>1,name=>"cat 1"),
             1 => array(id=>2,name=>"cat 2"),
             2 => array(id=>3,name=>"cat 1"));

当我搜索key=name和value=“cat 1”时,函数应该返回:

array(0 => array(id=>1,name=>"cat 1"),
      1 => array(id=>3,name=>"cat 1"));

我想函数必须是递归的,才能降到最深的水平。


长风秋雁
浏览 1087回答 3
3回答

烙印99

代码: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通过引用而不是通过值获取它的第四个参数;&是至关重要的。FYI:如果您的PHP版本较早,则必须在打电话到search_r而不是在宣言中。也就是说,最后一行变成search_r($subarray, $key, $value, &$results).

忽然笑

怎么样?SPL而不是版本?这样你就不用打字了:// I changed your input example to make it harder and// to show it works at lower depths:$arr = array(0 => array('id'=>1,'name'=>"cat 1"),              1 => array(array('id'=>3,'name'=>"cat 1")),              2 => array('id'=>2,'name'=>"cat 2"));//here's the code:     $arrIt = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));  foreach ($arrIt as $sub) {     $subArray = $arrIt->getSubIterator();     if ($subArray['name'] === 'cat 1') {         $outputArray[] = iterator_to_array($subArray);     }}最棒的是,基本上相同的代码将通过使用RecursiveDirectoryIterator而不是RecursiveArrayIterator来遍历目录。SPL是roxor。关于SPL,唯一令人沮丧的是,它在网络上被记录得很糟糕。但是,有几本PHP书籍涉及到一些有用的细节,特别是Pro PHP;而且您可能也可以在Google上搜索更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP