商城的菜单通常都是树状结构,我们来模仿实现以下。
原理都是相同的,所以我们来个简单点的结构就行。层级只有两层,有两大类:手机和电脑;每个大类下面分别有三个子类:
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>'; } }
结果: