首頁 >後端開發 >php教程 >如何有效率地將平面數組列表轉換為層次樹結構?

如何有效率地將平面數組列表轉換為層次樹結構?

Barbara Streisand
Barbara Streisand原創
2024-11-29 14:41:10605瀏覽

How to Efficiently Convert a Flat Array List into a Hierarchical Tree Structure?

將陣列列表轉換為樹結構

在這個問題中,我們的任務是將元素的平面數組轉換為分層樹狀結構。輸入數組由具有三個屬性的物件組成:id、parentid 和 name。輸出應該是一個樹狀結構,其中每個節點代表輸入數組中的一個元素,並具有屬於它的子節點列表。

為了解決這個問題,我們不能依賴像巢狀集合這樣的方法,因為資料庫限制。相反,我們利用遞歸演算法來建構樹。

$arr = array(
    array('id' => 100, 'parentid' => 0, 'name' => 'a'),
    array('id' => 101, 'parentid' => 100, 'name' => 'a'),
    array('id' => 102, 'parentid' => 101, 'name' => 'a'),
    array('id' => 103, 'parentid' => 101, 'name' => 'a'),
);

$new = array();
foreach ($arr as $a) {
    $new[$a['parentid']][] = $a;
}
$tree = createTree($new, array($arr[0]));

第一步,我們循環遍歷輸入數組並按其parentid對元素進行分組以創建一個新數組,其中每個鍵代表父級的id ,該值是其子級的數組。隨後,我們呼叫輔助函數 createTree 來遞歸地建構樹。

function createTree(&$list, $parent) {
    $tree = array();
    foreach ($parent as $k => $l) {
        if (isset($list[$l['id']])) {
            $l['children'] = createTree($list, $list[$l['id']]);
        }
        $tree[] = $l;
    }
    return $tree;
}

createTree 函數有兩個參數:重新組織的陣列 $list 和表示樹中目前層級的陣列 $parent。在函數中,我們迭代 $parent 陣列並檢查 $list 是否包含當前元素的任何子元素。如果找到子元素,我們會遞歸呼叫 createTree 來建立該元素的子樹,並將其新增為目前元素的 Children 屬性。最後,我們將目前元素追加到 $tree 陣列並傳回樹。

透過遵循此演算法,我們可以從提供的陣列列表有效地建構樹結構,產生之間的層次關係的嵌套表示元素。

以上是如何有效率地將平面數組列表轉換為層次樹結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn