2011-10-02 111 views
0

我试图实现一些我天真地相信会很简单:展平一个多维数组(可能有很多嵌套级别),但仍然有阵列作为结果。理想情况下,我正在寻找一个可以迭代10个嵌套级别的函数,并且可以处理不同的键集(不一定总是相同)。把一个多维的PHP数组变成一个二维数组

总之,把这个:

Array 
    (
     [0] => Array 
      (
       [0] => Array 
        (
         [index] => -1 
         [qty] => 77 
         [id] => 7 
        ) 

       [1] => Array 
        (
         [index] => -1 
         [qty] => 83 
         [id] => 8 
        ) 
      ) 

     [1] => Array 
      (
       [0] => Array 
        (
         [index] => -1 
         [qty] => 75 
         [id] => 13 
        ) 

       [1] => Array 
        (
         [index] => -1 
         [qty] => 60 
         [id] => 14 
         [msr] => g 
        ) 
      ) 

     [2] => Array 
      (
       [index] => -1 
       [qty] => 10 
       [id] => 12 
      ) 
    ) 

进入这个:

Array 
    (
     [0] => Array 
      (
       [index] => -1 
       [qty] => 77 
       [id] => 7 
      ) 

     [1] => Array 
      (
       [index] => -1 
       [qty] => 83 
       [id] => 8 
      ) 

     [2] => Array 
      (
       [index] => -1 
       [qty] => 75 
       [id] => 13 
      ) 

     [3] => Array 
      (
       [index] => -1 
       [qty] => 60 
       [id] => 14 
       [msr] => g 
      ) 

     [4] => Array 
      (
       [index] => -1 
       [qty] => 10 
       [id] => 12 
      ) 
    ) 

这是我和思考的工作,但我最终没有密钥信息的扁平阵列(如果我需要密钥,则每次迭代都会覆盖之前的值,最后我只用最后一个数组):

function flatten_multi_array(array $array){ 
    $ret_array = array(); 
    foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $value) { 
     $ret_array[] = $value; 
    } 
    return $ret_array; 
} 

回答

1
function dig($source, &$out){ 
    foreach ($source as $k => $v){ 
     if (isset($v["index"]){ 
      $out[] = $v; 
     } else { 
      dig($v, $out); 
     } 
    } 
} 

就是这样。

用法:

$out = array(); 
$source = array(); // your magic nested array 

dig($source, $out); 

现在$out有你需要的东西。

+0

感谢您的回复。但这并没有真正奏效。我得到一个平坦的数组,并失去所有关键信息... –

+0

当然,它确实合并子数组,不保存密钥。如果你需要密钥,那么只需用$ out = array(...,“key”=> $ k)替换$ out = $ v;从描述来看,不清楚这两个关键字是唯一的还是应该保留的。 – jancha

+0

我已经有一个功能,做了同样的事情(见编辑),如果我想有钥匙,因为它没有第二维,所有的值将被覆盖。在您的示例中为 –

0

喜欢的东西,也许这未经测试的代码...

$outArray = array(); 
foreach($originalArray as $nestedArray){ 
    foreach($nestedArray as $innerArray){ 
     $outArray[] = $innerArray; 
    } 
} 
print_r($outArray); 
+0

需要递归... – prodigitalson

+0

我错过了那个部分......从头抓起然后 –

0

我看到,这只是回答。好吧,我认为自从我做到这一点以后,我会提供我的解决方案。 :P

$newArray = array(); 
function isMulti($k,$v){ 
    global $newArray; 
    if(is_array($v)){ 
    foreach($v as $k2 => $v2){ 
     if(!is_array($v2)){ 
      $newArray[] = $v; 
      break; 
     }else{ 
      isMulti($k2,$v2); 
     } 
    } 
    } 
} 
foreach($arrayInQuestion as $k => $v){ 
    isMulti($k,$v); 
} 
+0

嗯,至少我的作品没有'索引'键。 :P – bozdoz

0

如果你还在寻找RecursiveIteratorIterator方法,请参阅以下内容:

foreach(new RecursiveIteratorIterator(new ParentIterator(new RecursiveArrayIterator($array)), RecursiveIteratorIterator::SELF_FIRST) as $value) { 
    if (isset($value['index'])) 
     $ret_array[] = $value; 
} 

这应该做你的函数中。请参阅demo

相关:Quick Recursive search of all indexes within an array

+0

谢谢!我非常喜欢这种替代方法! –

相关问题