2012-02-10 48 views
1

比方说,我有一个非常复杂的多维数组是这样的:检索multidiensional数组键没有无限嵌套的foreach

Array 
(
     [A] => Array 
      (
       [B] => Array 
        (
         [C] => Array 
          (
           [D] => Array 
            (
             [E] => Array 
              (
               [0] => Array 
                (
                 [id] => 
                 [firstname] => 
                 [lastname] => 
                ) 

              ) 

            ) 

          ) 

        ) 

      ) 

    ) 

在这个阵列中,按键的数量可以根据情况而变化,例如,钥匙可能只有A,B和C,或者只有A和B,甚至A,B,C,D,E,F,G,H等等。是否有可能收集键(内键A ,B,C,D和E在这种情况下)没有20个嵌套的foreach循环?

谢谢

+0

尝试递归!只是一秒钟,我会带代码... – hackartist 2012-02-10 19:44:12

回答

2

所以你想递归列举键?这里有一个函数来做到这一点:

function enumerateKeys($array, &$keys) { 
    if(!isset($keys)) { 
     $keys = array(); 
    } 

    foreach($array as $key => $value) { 
     if(is_array($value)) { 
      $keys[] = $key; /* Moved below if() to enumerate only array keys */ 
      enumerateKeys($value, $keys); 
     } 
    } 
} 

Here's a working demo.

+0

非常好的答案+1。 – hackartist 2012-02-10 19:52:12

+0

enumerateKeys($ array,$ keys);在工作演示中定义的变量$ keys在哪里? – user765368 2012-02-10 19:54:27

+0

@ user765368:不是。我通过引用传递它,所以不必定义它(因此'ensetrateKeys'中的isset'检查)。 – Ryan 2012-02-10 19:55:23

2

这里是你一个很好的递归解决方案:

function getKeys($yourArray) { 
    $allKeys = array(); 
    if(is_array($yourArray)) { 
    foreach($yourArray as $key => $value) { 
     $allKeys = array_push($allKeys,$key); 
     $allKeys = array_merge($allKeys,getKeys($value)); 
    } 
    } else { 
    //this line will also add the values if you want them 
    //if you only want keys then just leave it out 
    $allKeys = array_push($allKeys,$yourArray); 
    } 
    return $allKeys; 
}