2012-02-14 8 views
0

と仮定私はこのような配列があります。サブアレイの入れネストされた配列

Array(
     '1' => Array(
       "ID" => 1, 
        "Name" => "name 1" 
      ), 
     '2' => Array (
       Array(
        "ID" => 2, 
        "Name" => "name 2" 
       ) 
      ), 
     '3' => Array(
       Array(
        Array(
        Array(
         "ID" => 3, 
         "Name" => "name3" 
        ) 
       ) 
      ), 
     '4' => Array (
       Array { 
        "ID" => 4, 
        "Name" => "name 4" 
       ), 
       Array(
        "ID" => 5, 
        "Name" => "name 5" 
       ), 
       Array(
        "ID" => 6, 
        "Name" => "name 6" 
       ) 
      ); 

数は、それが3、4または5等... かもしれ注文されていないと私は取得したいです:

Array(
    Array("ID" => 1, "Name" => "name 1"), 
    Array("ID" => 2, "Name" => "name 2"), 
    Array("ID" => 3, "Name" => "name 3"), 
    Array("ID" => 4, "Name" => "name 4"), 
    Array("ID" => 5, "Name" => "name 5"), 
    Array("ID" => 6, "Name" => "name 6")); 

これを行う簡単な方法はありますか?

EDIT:追加するには、上記の配列を編集

:ネストされたが、私はまだ彼らが私の最後の配列になりたいされていない

'4' => Array (
       Array { 
        "ID" => 4, 
        "Name" => "name 4" 
       ), 
       Array(
        "ID" => 5, 
        "Name" => "name 5" 
       ), 
       Array(
        "ID" => 6, 
        "Name" => "name 6" 
       ) 
      ); 

ありがとうございました。

答えて

2
//Assuming your data is in $in 

$out=array(); 
foreach($in as $k=>$v) { 
    while ((is_array($v)) && (isset($v[0]))) $v=$v[0]; 
    //See below for next line 
    $out[]=$v; 
} 

print_r($out); 

であると仮定すると、あなたのために働くこと。あなたが入力配列を変更して、あなたがを示すバージョン

編集

を使用しない、そうあなたの所望の出力では、これはあなたに対して試験した

function addtoarray($inarray, &$outarray) { 
    foreach ($inarray as $i) { 
    if (!is_array($i)) continue; 
    if (isset($i['ID'])) $outarray[]=$i; 
    else addtoarray($i,$outarray); 
    } 
} 

$out=array(); 
addtoarray($in,$out); 
print_r($out); 

ような何かをする必要があります新しい入力データ

+0

ありがとうございます。要素は最終的な配列、任意の提案から欠けている? –

+0

私はあなたのサンプルデータをテストしましたが、すべてがそこで動作します。不足している要素を作成するサンプルデータを提供できますか? –

+0

私はそれをこのような大きな配列でテストしました。https://gist.github.com/1827734 –

0

アレイを再帰してIDフィールドを確認できます。

function combine_array(array $src, array &$dest) 
{ 
    if(isset($src['ID'])) { 
     $dest[] = $src; 
     return; 
    } 

    foreach($sub in $src) { 
     combine_array($sub, $dest); 
    } 
} 

これは私の頭の上からテストしていないので、少し問題があるかもしれません。しかしそれが基本的な考えです。

0

これは、$配列は、マークされた行は、あなたが第一レベルのキーを維持したい天気を依存$out[$k]=$v;または$out[]=$v;のいずれかであることで、変数やPHP 5.3

//process 
$array = array_map(function($block) { 
    $return = ''; 

    foreach ($block as $sub) { 
     if (true === isset($sub['ID']) { 
      $return = $block; 
      break; 
     } 
    } 

    return $block; 
}, $array); 

array_filter($array); //remove empty elements 
0

クイック再帰関数を書きました。データの相違によって簡単に無限ループに変わる可能性があるため、適切なエラー処理を記述してロジックをチェックする必要があります。

$output = array(); 

foreach ($data as $d) { 
    $output[] = loop_data($d); 
} 


function loop_data($data) { 
    // Check if this is the right array 
    if(! array_key_exists("ID", $data)) { 
     // Go deeper 
     $data = loop_data($data[0]); 
    } 

    return $data; 
}