php递归获取分类结构

商城的菜单通常都是树状结构,我们来模仿实现以下。

原理都是相同的,所以我们来个简单点的结构就行。层级只有两层,有两大类:手机和电脑;每个大类下面分别有三个子类:

 1 //从数据库获取的分类数据(省略获取步骤)
 2 //有“手机”和“电脑”两个大类
 3 //--手机{三星Glaxy,IphoneX,华为荣耀}
 4 //--电脑{Dell,Lenovo,IBM}
 5 
 6 $data = array(
 7 
 8     array('id' => 5, 'name' => '电脑', 'pid' => 0),
 9     array('id' => 1, 'name' => '手机', 'pid' => 0),
10     array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
11     array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
12     array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
13     array('id' => 6, 'name' => 'Dell', 'pid' => 5),
14     array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
15     array('id' => 8, 'name' => 'IBM', 'pid' => 5),
16 );
View Code

 

这种查子类当然是递归走起啊,定义一个递归查询的函数:

 1 /**
 2  * 递归获取结构树
 3  * @param  array $data  数据源
 4  * @param  integer $pid 父类id
 5  * @param  integer $level 深度
 6  * @return array 组装好的树
 7  */
 8 function get_tree($data, $pid = 0, $level = 0) {
 9     static $tree = array();
10     foreach ($data as $key => $row) {
11         if ($row['pid'] == $pid) {
12             $row['level'] = $level;
13             $tree[] = $row;
14             unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
15             get_tree($data, $row['id'], $level + 1);
16         }
17     }
18     return $tree;
19 }
View Code

 

调用函数,并输出:

$tree = get_tree($data, 0, 0);
var_dump($tree);

结果:

在用一个简单暴力的方式,呈现在页面上,感受一下:

/**
 * 输出树结构
 * @param  array 数据源
 * @return void
 */
function echo_tree($tree) {
    foreach ($tree as $row) {
        for ($i = $row['level']; $i > 0; $i--) {
            echo '|----';
        }
        echo $row['name'];
        echo '<br>';
    }
}
View Code

 

结果:

 

posted @ 2018-04-20 09:59  jiafeng  阅读(1217)  评论(0编辑  收藏  举报