您好,欢迎访问一九零五行业门户网

递归解决无限级分类的问题

小弟手中有分类3406条,存在category表中。现在用递归解决分类,做成select,如下图:
下面是php代码,但是生成select后有错误:
// $result是从数据库中读出的二维数组$result = array();while (($row = $info->fetch_array(mysqli_assoc)) != false) { // 改变数组的索引为分类的id $result[$row['id']] = $row;}$str = '';$str .= ; foreach ($result as $value) { if ($value['parent_id'] == 0) { $str .= {$value['title']}; $str .= get_children($value['id'], $result, 1); } }$str .= ;function get_children($id, &$result, $index) { $str = ''; foreach ($result as $key => $value) { if ($id == $value['parent_id']) { $str .= .str_repeat('---', $index).{$value['title']}; $str .= get_children($value['id'], $result, $index + 1); unset($result[$value['id']]); // 存在并且去掉这个以为数组 //echo count($result).'
'; } } return $str;} // 打印出select echo $str;

上面代码中,去掉unset执行最后的结果是对的,但是执行时间一般在八九秒。我的想法是存在这一条后把这一条从result结果集中去掉,这样的话以后循环的时候减少循环的次数,然后就能减少执行的时间,但是执行的结果是不对的,只存在省下面的一个地市,其余的地市没有了,研究了半天,也没有发现哪里错,请大神指正。
ps: 1。第一次发帖,不怎么会用,请谅解小弟。
2。有没有更好的办法递归3400多个分类。。
3.谢谢。。
回复内容: 小弟手中有分类3406条,存在category表中。现在用递归解决分类,做成select,如下图:
下面是php代码,但是生成select后有错误:
// $result是从数据库中读出的二维数组$result = array();while (($row = $info->fetch_array(mysqli_assoc)) != false) { // 改变数组的索引为分类的id $result[$row['id']] = $row;}$str = '';$str .= ; foreach ($result as $value) { if ($value['parent_id'] == 0) { $str .= {$value['title']}; $str .= get_children($value['id'], $result, 1); } }$str .= ;function get_children($id, &$result, $index) { $str = ''; foreach ($result as $key => $value) { if ($id == $value['parent_id']) { $str .= .str_repeat('---', $index).{$value['title']}; $str .= get_children($value['id'], $result, $index + 1); unset($result[$value['id']]); // 存在并且去掉这个以为数组 //echo count($result).'
'; } } return $str;} // 打印出select echo $str;

上面代码中,去掉unset执行最后的结果是对的,但是执行时间一般在八九秒。我的想法是存在这一条后把这一条从result结果集中去掉,这样的话以后循环的时候减少循环的次数,然后就能减少执行的时间,但是执行的结果是不对的,只存在省下面的一个地市,其余的地市没有了,研究了半天,也没有发现哪里错,请大神指正。
ps: 1。第一次发帖,不怎么会用,请谅解小弟。
2。有没有更好的办法递归3400多个分类。。
3.谢谢。。
关系数据库中的无限深度树状关系的表示有两种常见方案:
edge list tree(又写作adjacency list,即邻接表)
一行的表示类似于(子元素id, 父元素id)nested set tree(即左右值)
一行的表示类似于(当前元素左值, 当前元素右值)相信楼主用的是前者,这样的坏处是需要递归查询。而后者更易于查询,一条sql即可搞定,见@沙渺 的这篇文章。
针对lz的问题,如果嵌套关系表示使用的是左右值方法,拿到全量数据的前提下,在php中也可以用o(n)方式迭代数据得到所有需要的子节点和深度等数据,非常简单。
如果只是需要在前端使用这些树状数据,那么公子的方案是最简单的,比用数据库邻接表、服务器端递归遍历简单多了。
关于nested set:
wiki: nested set modelnested set的主要使用流程(常用查询,增删节点的方式等)nested set与adjacency list效率比较,以及如何使用r-tree索引进行进一步提速一个把edge list转化为nested set的mysql存储过程
这种东西干嘛要存到数据库中啊 =_=! http://www.soulteary.com/2013/05/10/jquery-city-select.html
其它类似信息

推荐信息