php生成树状层级子孙树-迭代篇

关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了。

以下是迭代的代码实现

<?php
$data = [
    ['id' => 1, 'name' => '中国', 'pid' => 0],
    ['id' => 2, 'name' => '江苏', 'pid' => 1],
    ['id' => 6, 'name' => '工业园区', 'pid' => 5],
    ['id' => 7, 'name' => '中新大道', 'pid' => 6],
    ['id' => 9, 'name' => '鄞州区', 'pid' => 4],
    ['id' => 3, 'name' => '浙江', 'pid' => 1],
    ['id' => 10, 'name' => '天童南路', 'pid' => 8],
    ['id' => 8, 'name' => '首南街道', 'pid' => 9],
    ['id' => 4, 'name' => '宁波', 'pid' => 3],
    ['id' => 5, 'name' => '苏州', 'pid' => 2],
    ['id' => 11, 'name' => '北京', 'pid' => 1],
    ['id' => 12, 'name' => '海淀', 'pid' => 11],
];

function getTree($data = [], $parent = 0)
{
    $target_list = [$parent];
    $tree = [];
    $level = 0;
    while (!empty($target_list)) {
        $flag = false;
        foreach ($data as $key => $value) {
            if ($value['pid'] == $parent) {
                $level++;
                $value['level'] = $level;
                $tree[] = $value;
                $target_list[] = $parent = $value['id'];
                unset($data[$key]);
                $flag = true;
            }
        }
        if (!$flag) {
            $level--;
            array_pop($target_list);
            $parent = end($target_list);
        }
    }
    return $tree;
}

$list = getTree($data, 0);

foreach ($list as $v) {
    $level = isset($v['level']) ? $v['level'] : 0;
    echo str_repeat('    ', $level - 1) . $v['name'] . "\r\n";
}

输出结果如下:

这里我特意把传递的数据打乱顺序,看看它能不能获取到正确的顺序层级,这样一看也没问题。

这个迭代的核心思想是用target_list去存储当前要找的那个父级,找到了就追加进去,层级++,找不到就弹出来一个,层级--

可以看一下以前我写递归的方式,递归就很好理解,但是自己心里面就是感觉效率上和安全上面差点意思,代码如下:

用数据库的数据算了一下效率,其实差不多,没有很明显的差距,当数据量只有几条的时候迭代比递归甚至还慢一点,当数据量有四千多条的时候(省市县三级数据)迭代比递归稍微快一点点,但是真的不明显。

看来这里还需要一个更强更好的算法来解决该问题啊!

 

posted @ 2024-02-28 14:56  李照耀  阅读(35)  评论(0编辑  收藏  举报