
商城的菜单通常都是树状结构,我们来模仿实现以下。
原理都是相同的,所以我们来个简单点的结构就行。层级只有两层,有两大类:手机和电脑;每个大类下面分别有三个子类:
//从数据库获取的分类数据(省略获取步骤)
//有“手机”和“电脑”两个大类
//--手机{三星Glaxy,IphoneX,华为荣耀}
//--电脑{Dell,Lenovo,IBM} $data = array( array('id' => 5, 'name' => '电脑', 'pid' => 0),
array('id' => 1, 'name' => '手机', 'pid' => 0),
array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
array('id' => 6, 'name' => 'Dell', 'pid' => 5),
array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
array('id' => 8, 'name' => 'IBM', 'pid' => 5),
);
这种查子类当然是递归走起啊,定义一个递归查询的函数:
/**
* 递归获取结构树
* @param array $data 数据源
* @param integer $pid 父类id
* @param integer $level 深度
* @return array 组装好的树
*/
function get_tree($data, $pid = 0, $level = 0) {
static $tree = array();
foreach ($data as $key => $row) {
if ($row['pid'] == $pid) {
$row['level'] = $level;
$tree[] = $row;
unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
get_tree($data, $row['id'], $level + 1);
}
}
return $tree;
}
调用函数,并输出:
$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>';
}
}
结果: