看了四年之前写的关于迭代循环的一片文章,已经完全看不懂了,不是逻辑难,而是没有注释,格式不规范,各种不细心,而且没有思路讲解,让人一头雾水。好的介绍是什么?让人看注释就能明白你要干什么,甚至都不用看代码
先说思路吧:这是一个关于分类的方法,无限分类。也就是说不知道有多少层关系,比如家居->厨房用具->炒锅->苏泊尔这是有四层,家居->门窗->大帝门窗这个有三层,也就是说层级不确定,那要求实现什么样的效果呢?要求列表显示,带有缩进。也就是
数据库中的数据基本的是cate_id和parent_id,以及判断该分类是否有子分类的has_child字段
总体思路:这类信息从数据库中取出来按照分类排序的话肯定是多维数组,因为是层级关系。但要实现我们想要的效果要搞成一维数组。那么问题来了,搞成一维的,如何缩进呢?再加一个字段,表示缩进。那么问题来了,现在实现想要的效果需要两部。第一:从数据库中读取数据按照层级关系放进多维数组中。第二:将多维数组按照层级关系转换成一维数组,并带有缩进标示。
这里我只写总体的代码
<?php
/**
* Created by PhpStorm.
* User: zhuxinlei
* Date: 14-6-10
* Time: 下午10:24
*/
class abc
{
public function getchild($id = 0)
{
return $this->where('parent_id = ' . $id)->select();
}
public function build_tree($id = 0)
{
//获取子分类信息
$child = $this->getchild($id);
//如果是没有子分类的话返回Null
if (empty($child)) {
return null;
}
//遍历父类(因为子类的话已经返回null),再次调用本方法,将重新获得的子类信息赋值给父类的child字段
//唯一一个有点思维难度的是不断赋值给$child,$child不会被覆盖吗?不会,因为每次调用的都是新方法里的变量
foreach ($child as $k => $val) {
$tree = $this->build_tree($val['cate_id']);
if($tree != null){
$child[$k]['child'] = $tree;
}
}
return $child;
}
public function rebuild_tree($tree){
//静态变量的值不会被覆盖,会叠加
static $tmp;
foreach($tree as $k=>$val){
if(is_array($val)){
$this->rebuild_tree($val);
}else{
$tmp[] = $val;
}
}
return $tmp;
}
public function getlist()
{
//此时tree为多维数组
$tree = $this->build_tree(0);
//此时rebuild_tree已经转化为一维数组
$rebuild_tree = $this->rebuild_tree($tree);
}
}
?>