PHP实现无极限分类
PHP实现无极限分类
1、添加子目录
<?php
/**
* @description
* @param array $arr 二维数组
* @param string $pk 主键id
* @param string $upid 表示父级id的字段
* @param string $child 子目录的键
* @return array
*/
function getTree($arr=array(),$pk='id',$upid='pid',$child='child'){
$items = array();
foreach($arr as $val){
$items[$val[$pk]] = $val;
}
$tree = array();
foreach($items as $k=>$val){
if(isset($items[$val[$upid]])){
$items[$val[$upid]][$child][]=&$items[$k];
}else{
$tree[] = &$items[$k];
}
}
return $tree;
}
$arr = array(
array('id' => 1, 'name' => '系统设置', 'pid' => 0),
array('id' => 2, 'name' => '菜单设置', 'pid' => 0),
array('id' => 3, 'name' => '添加菜单', 'pid' => 2),
array('id' => 4, 'name' => '编辑菜单', 'pid' => 2),
array('id' => 7, 'name' => '修改菜单', 'pid' => 4),
array('id' => 5, 'name' => '网站设置', 'pid' => 1),
array('id' => 6, 'name' => '支付设置', 'pid' => 0)
);
getTree($arr);
?>
效果如下:

2、树形结构
<?php
/**
* @description
* @param array $arr 传入的二维数组
* @param string $pk 主键id
* @param string $name 分类名称
* @param string $upid 表示父级id的字段
* @param int $root 根级别(最高父级一般为0)
* @param int $index 层级
* @return array
*/
function getTree($arr = array(),$pk='id',$name='name',$upid='pid',$root=0,$index=0){
$tree = array();
foreach ($arr as $k=>$value) {
if($value[$upid]==$root){
$value[$name] = str_repeat('|--', $index).$value[$name];
$tree[] = $value;
$tree = array_merge($tree,getTree($arr,$value[$pk],$index+1));
}
}
return $tree;
}
?>
3.生成HTML分类代码
/**
* @description
* @param $data 为调用上面方法2(添加子目录)得到的结果
*/
function makeHtml($data,&$str='')
{
$str .= '<ul>';
foreach ($data as $key => $val) {
$cateId = $val['id'];
if (isset($val['child']) && !empty($val['child'])) {
$str .= "<li class='hasChild top'><a data-id='{$cateId}'>" . $val['name'] . "</a>";
makeHtml($val['child'],$str);
$str .= '</li>';
} else {
$className = $val['pid'] == 0 ? 'top' : '';
$str .= "<li class='{$className}'><a data-id='{$cateId}'>" . $val['name'] . "</a></li>";
}
}
$str .= '</ul>';
return $str;
}
echo makeHtml($data);
效果如下:


浙公网安备 33010602011771号