簡體   English   中英

如何使用for循環預覽鄰接列表樹(非遞歸解決方案)

[英]how to preview the adjacency list tree by using for loops (Non-recursive solution)

我使用鄰接表方法將樹存儲在MySQL數據庫中

當我想預覽樹時,PHP從數據庫中檢索整個樹並使用遞歸預覽。

但是迭代在性能上優於遞歸,因此我想使用for循環填充樹以獲得更好的性能。

我不想使用任何MySQL函數或方法或觸發器,我只想通過使用迭代(用於循環)來填充樹

在尋找有關在IRC上回答類似問題的助手的鏈接時,我偶然發現了這個古老的懸而未決的問題。

這是一個粗略的示例,展示了如何從鄰接列表構建路徑列表,它要求數據先按“父”然后按“ id”進行排序,然后可以很容易地將其轉換為帶有ORDER BY parent, id的SQL SELECT ORDER BY parent, id子句:

<?php
$arr = [
    ['id' => 1, 'parent' => 0],
    ['id' => 2, 'parent' => 1],
    ['id' => 3, 'parent' => 2], 
    ['id' => 4, 'parent' => 3], 
    ['id' => 5, 'parent' => 0],
    ['id' => 6, 'parent' => 5],
    ['id' => 7, 'parent' => 5], 
    ['id' => 8, 'parent' => 7],
    ['id' => 9, 'parent' => 8],
    ['id' => 10, 'parent' => 5],
    ['id' => 11, 'parent' => 0],
    ['id' => 12, 'parent' => 5],
    ['id' => 13, 'parent' => 5],
    ['id' => 14, 'parent' => 11],
    ['id' => 15, 'parent' => 13],
    ['id' => 16, 'parent' => 1],
    ['id' => 17, 'parent' => 15],
];

usort($arr, function($a, $b) { return $a['parent'] - $b['parent']?: $a['id'] - $b['id']; });

$paths = [];
foreach($arr as $current) {
    if($current['parent'] > 0) {
        $paths[ $current['id'] ] = array_merge($paths[ $current['parent'] ], [ $current['parent'] ]);
    } else {
        $paths[ $current['id'] ] = [];
    }
}

ksort($paths);
foreach($paths as $k => $v) {
    printf("%s => %s\n", $k, implode('/', array_merge($v, [ $k ])));
}

輸出:

1 => 1
2 => 1/2
3 => 1/2/3
4 => 1/2/3/4
5 => 5
6 => 5/6
7 => 5/7
8 => 5/7/8
9 => 5/7/8/9
10 => 5/10
11 => 11
12 => 5/12
13 => 5/13
14 => 11/14
15 => 5/13/15
16 => 1/16
17 => 5/13/15/17

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM