我们有时候需要将分类数据按树状效果展示出来,能一眼就看出来层级的组织关系,实现如下:
注意:我所讲的分类为无限极分类 ,如下的函数所涉及的表字段名有三个 id pid name ,如果有定义名称不同请查询分类列表数据时对应给字段取别名对应上 id pid name ,比如 你的pid 表字段名定义为 parent_id 那么查询时 给该字段取别名为 "parent_id as pid ";
函数如下:
/**
* $list 为查询 出来的二维数组
**/
function getTree($list,$pid=0,$itemprefix = '') {
static $icon = array('│', '├', '└');
static $nbsp = " ";
static $arr = array();
$number = 1;
foreach($list as $row) {
if($row['pid'] == $pid) {
$brotherCount = 0;
//判断当前有多少个兄弟分类
foreach($list as $r) {
if($row['pid'] == $r['pid']) {
$brotherCount++;
}
}
if($brotherCount >0) {
$j = $k = '';
if($number == $brotherCount) {
$j .= $icon[2];
$k = $itemprefix ? $nbsp : '';
}else{
$j .= $icon[1];
$k = $itemprefix ? $icon[0] : '';
}
$spacer = $itemprefix ? $itemprefix . $j : '';
$row['name'] = $spacer.$row['name'];
$arr[] = $row;
$number++;
getTree($list,$row['id'],$itemprefix . $k . $nbsp);
}
}
}
return $arr;
}
使用示例:
<?php
header("Content-type:text/html;Charset=utf8");
function getTree($list,$pid=0,$itemprefix = '') {
static $icon = array('│', '├', '└');
static $nbsp = " ";
static $arr = array();
$number = 1;
foreach($list as $row) {
if($row['pid'] == $pid) {
$brotherCount = 0;
//判断当前有多少个兄弟分类
foreach($list as $r) {
if($row['pid'] == $r['pid']) {
$brotherCount++;
}
}
if($brotherCount >0) {
$j = $k = '';
if($number == $brotherCount) {
$j .= $icon[2];
$k = $itemprefix ? $nbsp : '';
}else{
$j .= $icon[1];
$k = $itemprefix ? $icon[0] : '';
}
$spacer = $itemprefix ? $itemprefix . $j : '';
$row['name'] = $spacer.$row['name'];
$arr[] = $row;
$number++;
getTree($list,$row['id'],$itemprefix . $k . $nbsp);
}
}
}
return $arr;
}
//$list 模拟数据库查询出来的数据
$list = array();
$list = [
['id'=>1,'pid'=>0,'name'=>'总经理'],
['id'=>9,'pid'=>7,'name'=>'人事二组职员2'],
['id'=>2,'pid'=>1,'name'=>'人事部经理'],
['id'=>3,'pid'=>2,'name'=>'人事一组长'],
['id'=>13,'pid'=>12,'name'=>'技术一组职员1'],
['id'=>4,'pid'=>3,'name'=>'人事一组职员1'],
['id'=>5,'pid'=>3,'name'=>'人事一组职员2'],
['id'=>6,'pid'=>3,'name'=>'人事一组职员3'],
['id'=>7,'pid'=>2,'name'=>'人事二组长'],
['id'=>8,'pid'=>7,'name'=>'人事二组职员1'],
['id'=>10,'pid'=>7,'name'=>'人事二组职员3'],
['id'=>15,'pid'=>12,'name'=>'技术一组职员3'],
['id'=>11,'pid'=>1,'name'=>'技术部经理'],
['id'=>12,'pid'=>11,'name'=>'技术一组长'],
['id'=>14,'pid'=>12,'name'=>'技术一组职员2'],
];
//执行函数
$list = getTree($list);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>层级下拉列表效果</title>
<select name="" id="">
<?php foreach($list as $row): ?>
<option value=""> <?php echo $row['name']; ?></option>
<?php endforeach;?>
</select>
</head>
<body>
</body>
</html>
效果:
function getCateTree($list, $pid=0, $level=0) {
// 定义静态数组用于存放格式化之后分类列表
static $cate_list = array();
// 遍历
foreach($list as $row) {
if($row['cate_pid'] == $pid) {
$row['level'] = $level;
$cate_list[] = $row;
// 递归点
getCateTree($list, $row['cate_id'], $level+1);
}
}
// 返回遍历结果
return $cate_list;
}