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去存储当前要找的那个父级,找到了就追加进去,层级++,找不到就弹出来一个,层级--
可以看一下以前我写递归的方式,递归就很好理解,但是自己心里面就是感觉效率上和安全上面差点意思,代码如下:
用数据库的数据算了一下效率,其实差不多,没有很明显的差距,当数据量只有几条的时候迭代比递归甚至还慢一点,当数据量有四千多条的时候(省市县三级数据)迭代比递归稍微快一点点,但是真的不明显。
看来这里还需要一个更强更好的算法来解决该问题啊!