2011-10-02 14 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 
      ) 
    ) 

これは私が持っていたし、仕事だろうと思ったものですが、私はノーキー情報(平らな配列で終わるをキーが必要な場合は、すべての反復で前の値が上書きされ、最後の配列だけがすべて終了します)。

答えて

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 = $ vを$ out = array(...、 "key" => $ k)に置き換えます。説明から、いずれかのキーが一意であるか維持されるべきかは不明であった。 – jancha

+0

私はすでに同じことをしていた(編集を参照してください)関数を持っていました。もしキーを持っていたら、2番目の次元を持たないので、すべての値が上書きされます。あなたの例では –

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

ありがとう!私はこの代替アプローチが本当に好きです! –