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 );
这种查子类当然是递归走起啊,定义一个递归查询的函数:

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 }
调用函数,并输出:
$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>'; } }
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2017-04-20 drupal 开发笔记