2012-02-14 61 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")); 

有沒有簡單的方法來做到這一點?

編輯

編輯上面數組中添加:

'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); 

與所述標記線是既取決於無論您想保持1級按鍵$out[$k]=$v;$out[]=$v; 。在您需要的輸出你,所以使用所示版本

編輯

隨着你改變輸入數組,你需要做的是這樣

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

謝謝您的回答,您的解決方案工作,但問題是,一些元素從最終數組中缺失,有什麼建議? – 2012-02-14 15:49:22

+0

我剛剛測試過你的示例數據,一切正常。你能否給出創建缺失元素的示例數據? – 2012-02-14 15:51:47

+0

我測試了一個像這樣的大陣列https://gist.github.com/1827734 – 2012-02-14 15:57:43

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

這可能會爲你工作,假設$數組變量和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; 
}