引用实现无限极分类
function generateTree($array){
//第一步 构造数据
$items = array();
foreach($array as $value){
$items[$value['id']] = $value;
}
//第二部 遍历数据 生成树状结构
$tree = array();
foreach($items as $key => $value){
if(isset($items[$value['pid']])){
$items[$value['pid']]['son'][] = &$items[$key];
}else{
$tree[] = &$items[$key];
}
}
return $tree;
}
//递归性能差,引用效果更加
function generateTree($data)
{
$items = array();
foreach ($data as $v) {
$items[$v['id']] = $v;
}
$tree = array();
foreach ($items as $k => $item) {
if (isset($items[$item['pid']])) {
$items[$item['pid']]['son'][] = &$items[$k];
} else {
$tree[] = &$items[$k];
}
}
return $tree;
}
效果
Array
(
[0] => Array
(
[id] => 1
[pid] => 0
[uid] => 2
[msg] => 哈啊
[action_id] => 1
[time] => 2020-09-23 19:06:32
[son] => Array
(
[0] => Array
(
[id] => 2
[pid] => 1
[uid] => 1
[msg] => 哈?
[action_id] => 1
[time] => 2020-09-23 19:07:17
[son] => Array
(
[0] => Array
(
[id] => 4
[pid] => 2
[uid] => 1
[msg] => 666
[action_id] => 1
[time] => 2020-09-23 19:09:01
[son] => Array
(
[0] => Array
(
[id] => 5
[pid] => 4
[uid] => 3
[msg] => cdfgh
[action_id] => 1
[time] => 2020-09-24 10:05:37
)
)
)
)
)
)
)
[1] => Array
(
[id] => 3
[pid] => 0
[uid] => 3
[msg] => 66
[action_id] => 1
[time] => 2020-09-23 19:07:35
)
)
php最简单的无限极分类
先看看二级分类是如何实现的:
数据库:
php代码:
tp3.2测试的
public function index(){
$db = D('listname');
$arr_a = $db->where(array('ishidden'=>1,'parentid'=>0))->select();
foreach($arr_a as $k=>$v){
$arr_b = $db->where(array('ishidden'=>1,'parentid'=>$v['id']))->select();
$arr_a[$k]['son']=$arr_b;
}
$this->assign('arr',$arr_a);
$this->display();
}
<volist name="arr" id="vo">
<dl id="menu-member">
<dt><i class="Hui-iconfont"></i> {$vo.listname}<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<volist name="vo.son" id="va">
<li><a data-href="member-list.html" data-title="{$va.listname}" href="javascript:;">{$va.listname}</a></li>
</volist>
</ul>
</dd>
</dl>
</volist>
效果:
这个是无限极分类
CI框架测试的
下面是数据库:
CREATE TABLE `listname` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`listname` varchar(64) NOT NULL,
`parentid` int(10) NOT NULL,
`ishidden` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1不隐藏 2隐藏',
`sort` tinyint(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of listname
-- ----------------------------
INSERT INTO `listname` VALUES ('1', '文章管理', '0', '1', '1');
INSERT INTO `listname` VALUES ('2', '词库管理', '0', '1', '2');
INSERT INTO `listname` VALUES ('3', '采集管理', '0', '1', '3');
INSERT INTO `listname` VALUES ('4', '网站管理', '0', '1', '4');
INSERT INTO `listname` VALUES ('5', '文章列表', '1', '1', '0');
INSERT INTO `listname` VALUES ('6', '关键词列表', '2', '1', '0');
INSERT INTO `listname` VALUES ('7', '采集规则设置', '3', '1', '0');
INSERT INTO `listname` VALUES ('8', '采集规则详情', '3', '1', '0');
INSERT INTO `listname` VALUES ('9', '推送设置', '3', '1', '0');
INSERT INTO `listname` VALUES ('11', '网站基本设置', '4', '1', '0');
INSERT INTO `listname` VALUES ('12', '用户管理', '0', '1', '0');
INSERT INTO `listname` VALUES ('13', '用户列表', '12', '1', '5');
INSERT INTO `listname` VALUES ('14', '修改密码', '12', '1', '0');
代码:
public function index(){
$sql = "select * from listname";
$res = $this->db->query($sql);
$arr = $res->result_array();
$res = $this->getTree($arr);
foreach($res as $value){
echo str_repeat('--', $value['level']), $value['listname'].'<br />';
}
echo '<pre>';
print_r($res);
exit;
$this->load->view('home/index');
}
public function getTree($array, $pid =0, $level = 0){
//声明静态数组,避免递归调用时,多次声明导致数组覆盖
static $list = [];
foreach ($array as $key => $value){
//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
if ($value['parentid'] == $pid){
//父节点为根节点的节点,级别为0,也就是第一级
$value['level'] = $level;
//把数组放到list中
$list[] = $value;
//把这个节点从数组中移除,减少后续递归消耗
unset($array[$key]);
//开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
$this->getTree($array, $value['id'], $level+1);
}
}
return $list;
}
输出结果: