2011-10-06 52 views
1

我有一個數組:我想嵌套數組。第三個層次是消失

$a = array(
    "7" => array(
     "id" => 7, 
     "parent" => 6 
    ), 
    "6" => array(
     "id" => 6, 
     "parent" => 5 
    ), 
    "5" => array(
     "id" => 5, 
     "parent" => 4 
    ), 
    "4" => array(
     "id" => 4, 
     "parent" => 0 
    ), 
    "3" => array(
     "id" => 7, 
     "parent" => 2 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

結果是:

$a = array(
    "4" => array(
     "id" => 4, 
     "parent" => 0, 
     array(
      "5" => array(
       "id" => 5, 
       "parent" => 4, 
       array(
        "6" => array(
         "id" => 6, 
         "parent" => 5, 
         array(
          "7" => array(
           "id" => 7, 
           "parent" => 6 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1, 
     array(
      "3" => array(
       "id" => 7, 
       "parent" => 2 
      ) 
     ) 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

,我使用的代碼是這樣的:

foreach($a as $v) 
{ 
    if(isset($a[$v['PARENT']])) 
    { 
     $a[$v['PARENT']][$v['ID']] = $v; 
     unset($a[$v['ID']]); 
    } 
} 

和問題是我得到的結果是:

$a = array(
    "4" => array(
     "id" => 4, 
     "parent" => 0, 
     array(
      "5" => array(
       "id" => 5, 
       "parent" => 4 
      ) 
     ) 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1, 
     array(
      "3" => array(
       "id" => 7, 
       "parent" => 2 
      ) 
     ) 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

而不是它的結果。

+0

任何人都可以幫助我嗎? :? –

+0

有人幫我嗎? –

+0

我已經在您的上一個問題中爲您的問題提供了[解決方案](http://stackoverflow.com/questions/7671905/nested-array-to-html-list/7672073#7672073)。它不工作? – binaryLV

回答

4

解決你的問題,你需要正確地理解如何variable referencing/aliasing in PHP作品。

請看下面的示例代碼,它不看你太大的不同,但利用引用才能訪問,即使它已經「移師」任何父母:

# transform $flat into a tree: 
foreach($flat as $id => &$value) 
{ 
    # check if there is a parent 
    if ($parentId = $value['parent']) 
    { 
     $flat[$parentId][0][$id] =& $value; # add child to parent 
     unset($flat[$id]); # remove reference from topmost level 
    } 
} 
unset($value); # remove iterator reference 
print_r($flat); # your tree 

$flat現在包含所有值從$flat - 但重新排序。 Demo

+0

整潔。 +1給你... – DaveRandom

+0

非常感謝!你的幫助對我來說非常重要! –

1

你確定輸出數組是正確的嗎?關鍵2肯定是1的孩子(因爲2'parent'=>1)?如果情況並非如此,我不明白究竟在做什麼以及密鑰如何相互關聯。

如果2應該是1一個孩子,這個工程:

$keep = array(); 
foreach ($a as $k => &$v) { 
    // Loop the array first time and create references to 
    // structure the array how you want it 
    if ($v['parent']) { 
    $a[$v['parent']][0] = array($k => &$v); 
    } else $keep[] = $k; 
} 

foreach ($a as $k => $v) { 
    // Loop it again to get rid of non-root nodes from the root 
    if (!in_array($k,$keep)) { 
    unset($a[$k]); 
    } 
} 

print_r($a); 
+0

您可以將第二個foreach中的代碼放入第一個(在用'$ keep'改變代碼之前) – hakre

+0

@Hakre我的確在想這件事,但我認爲你不可以 - 如果你隨意移除它們,並且後面的元素具有一個你沒有設置,它不會工作,我認爲,我玩了一段時間,並沒有提出一個實際上按預期工作的單個循環,但會很高興被證明是錯誤的,但... – DaveRandom

+0

檢查[我的答案](http://stackoverflow.com/questions/7673044/nested-array-third-level-is-消失/ 7673415#7673415),它有一個單一的循環。並玩一個演示。你甚至可以移動上一行將unild($ flat [$ id])* *移到父代的那一行。 – hakre