目錄
Understanding the Input Data
Step 1: Map Items by ID
Step 2: Attach Children to Parents
Step 3: Resulting Tree Structure
Optional: Recursive Function to Build Tree (Alternative)
Key Points
首頁 後端開發 php教程 具有PHP關聯陣列的建築遞歸樹結構

具有PHP關聯陣列的建築遞歸樹結構

Aug 04, 2025 pm 12:52 PM
PHP Associative Arrays

要將扁平數據構建成遞歸樹結構,需使用關聯數組高效映射節點;1. 遍歷數據創建以ID為鍵的關聯數組,每個節點初始化空children;2. 再次遍歷,通過parent_id將當前節點引用加入父節點的children數組中,根節點放入tree數組;3. 最終得到嵌套樹結構,該方法時間複雜度接近O(n),優於遞歸方案,適用於分類、評論等層級場景。

Building Recursive Tree Structures with PHP Associative Arrays

When working with hierarchical data in PHP—like categories, comments, or organizational structures—you often need to build recursive tree structures from flat data. Associative arrays in PHP are perfect for this task because they allow you to map IDs to nodes and efficiently nest children under their parents.

Building Recursive Tree Structures with PHP Associative Arrays

Here's how to convert a flat list (eg, from a database) into a nested tree using recursive logic and associative arrays.


Understanding the Input Data

Assume you have a flat array of items, each with an id , parent_id , and some data :

Building Recursive Tree Structures with PHP Associative Arrays
 $flatData = [
    ['id' => 1, 'parent_id' => null, 'name' => 'Electronics'],
    ['id' => 2, 'parent_id' => 1, 'name' => 'Mobile Phones'],
    ['id' => 3, 'parent_id' => 1, 'name' => 'Laptops'],
    ['id' => 4, 'parent_id' => 2, 'name' => 'Smartphones'],
    ['id' => 5, 'parent_id' => 4, 'name' => 'Android'],
    ['id' => 6, 'parent_id' => 4, 'name' => 'iOS'],
];

Our goal is to turn this into a nested tree where each node contains its children.


Step 1: Map Items by ID

First, build an associative array where each id points to its full data, and add an empty children array to each:

Building Recursive Tree Structures with PHP Associative Arrays
 $items = [];
foreach ($flatData as $item) {
    $item['children'] = [];
    $items[$item['id']] = $item;
}

This gives us fast access to any node by ID.


Step 2: Attach Children to Parents

Loop through the items and attach each item to its parent using parent_id . If parent_id exists, push the item into the parent's children array. Root items (with null parent) will remain top-level.

 $tree = [];

foreach ($items as $id => &$item) {
    $parentId = $item['parent_id'];
    if ($parentId === null) {
        $tree[] = &$item;
    } else {
        if (isset($items[$parentId])) {
            $items[$parentId]['children'][] = &$item;
        }
    }
}
unset($item); // break reference

We use references ( & ) to ensure changes propagate correctly.


Step 3: Resulting Tree Structure

Now $tree contains the root nodes, each with recursively nested children:

 print_r($tree);

Output (simplified):

 Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 
            [name] => Electronics
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [name] => Mobile Phones
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                            [parent_id] => 2
                                            [name] => Smartphones
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 5
                                                            [parent_id] => 4
                                                            [name] => Android
                                                            [children] => Array()
                                                        )
                                                    [1] => Array
                                                        (
                                                            [id] => 6
                                                            [parent_id] => 4
                                                            [name] => iOS
                                                            [children] => Array()
                                                        )
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [name] => Laptops
                            [children] => Array()
                        )
                )
        )
)

Optional: Recursive Function to Build Tree (Alternative)

You can also use recursion to build the tree, though it's less efficient for large datasets:

 function buildTree($items, $parentId = null) {
    $branch = [];
    foreach ($items as $item) {
        if ($item['parent_id'] == $parentId) {
            $children = buildTree($items, $item['id']);
            if ($children) {
                $item['children'] = $children;
            }
            $branch[] = $item;
        }
    }
    return $branch;
}

$tree = buildTree($flatData);

This version avoids references but has O(n²) time complexity in the worst case. The associative array mapping method is more scalable.


Key Points

  • Use associative arrays to map id => node for O(1) lookups.
  • Build the tree iteratively by attaching children to parents via references.
  • Avoid repeated scanning by leveraging parent-child relationships.
  • Be cautious with references in PHP—always unset after looping by reference.

This pattern is widely used in CMS systems, e-commerce categories, comment threads, and file directory structures.

Basically, it's not complex—but using associative arrays smartly makes it fast and clean.

以上是具有PHP關聯陣列的建築遞歸樹結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1596
276
優化大型關聯陣列的內存足跡 優化大型關聯陣列的內存足跡 Aug 03, 2025 pm 03:30 PM

Toreducememoryusageinlargeassociativearrays,firstchooseacompactdatastructurelikeflat_hash_maporperfecthashingforstaticdata,thenoptimizekeyandvaluerepresentationsbyusingsmallertypes,interningstrings,andavoidingpointers,followedbytuningtheloadfactorand

超越``foreach'':使用迭代器和`array_walk''的掌握迭代 超越``foreach'':使用迭代器和`array_walk''的掌握迭代 Aug 05, 2025 am 08:07 AM

使用迭代器(如實現Iterator接口的類)可高效處理大數據集,避免內存浪費;2.array_walk適用於直接修改原數組的場景,支持通過引用操作元素和訪問鍵;3.與array_map不同,array_walk不生成新數組,適合就地轉換;4.可結合迭代器與回調函數構建可複用、可組合的數據處理邏輯;5.foreach仍適用於簡單循環,但在復雜場景下應選用迭代器或array_walk以提升效率和代碼質量。掌握這些技術能實現更高效、靈活的PHP數據遍歷與轉換。

使用PHP關聯陣列實施集合和字典數據結構 使用PHP關聯陣列實施集合和字典數據結構 Aug 06, 2025 am 01:02 AM

phpassiativearrayscanbeusedtoimpletementseteTAndDictionAryDattructures.1.foraset,usearrayKeykeyStostoStoreNiquelements,enaplingo(1)平均timecomplexityforadd,emove and emove and lookeupoperationsviaissetviaisset(and lookeuperationsviaisset()和foradectionary,andunset()

具有PHP的關聯陣列的功能編程範例 具有PHP的關聯陣列的功能編程範例 Aug 03, 2025 pm 04:18 PM

Useimmutablearraysbyreturningnewarraysinsteadofmodifyingoriginals;2.Applyhigher-orderfunctionslikearray_map,array_filter,andarray_reduceforcleantransformations;3.ChainoperationsusingnestedcallsoraCollectionclasstocreatefunctionalpipelines;4.Writepure

轉換數據結構:`array_column` vs. 轉換數據結構:`array_column` vs. Aug 05, 2025 pm 05:42 PM

array_column適用於提取單列值或創建鍵值映射,而array_map適用於復雜數據轉換;1.當只需提取如姓名、ID等單一字段時,使用array_column更簡潔高效;2.當需要組合字段、添加邏輯或構建新結構時,使用array_map提供完全控制;3.array_column性能更高且支持第三參數作為鍵索引;4.array_map可處理多數組和條件邏輯,但開銷較大;5.兩者可結合使用,如先用array_column提取再用array_map處理。

解剖數組合併:`array_merge`與聯合操作員() 解剖數組合併:`array_merge`與聯合操作員() Aug 06, 2025 pm 06:24 PM

array_merge()和 操作符在PHP數組合併中行為不同:1.array_merge()會重新索引numeric鍵並覆蓋string鍵,後續值優先;2. 操作符保留左側數組的鍵值,僅當右側鍵不存在時才添加,左側值優先;3.array_merge()適用於追加數據或配置覆蓋, 適用於設置默認值;4.兩者均不支持深層嵌套合併,需自定義遞歸邏輯;因此根據意圖選擇:需重新索引用array_merge(),需保留原有鍵值不被覆蓋用 。

有效的JSON序列化策略用於多維關聯陣列 有效的JSON序列化策略用於多維關聯陣列 Aug 03, 2025 am 11:50 AM

NormalizethedatastructurebeforeserializationtoensureconsistencyandavoidambiguityinJSONoutput.2.Handlenon-serializabledatatypesbyrecursivelyfilteringorcastingvaluestoscalarsandusingJsonSerializableforcustomobjects.3.UseJSONconstantslikeJSON_PRETTY_PRI

使用' Uasort”和`uksort'的高級排序策略用於復雜數據 使用' Uasort”和`uksort'的高級排序策略用於復雜數據 Aug 17, 2025 am 04:05 AM

uasort()anduksort()preserveKey-valueAssociations whileLaweLaweCustomTingByValuesorKeySoreSuseruser-definedComparisonFunctions; 1)useUtueUasort()

See all articles