首页
IT
登录
6mi
u
盘
搜
搜 索
IT
以迭代(非递归)方式获取无限分类中所有的最后一层子节点数据
以迭代(非递归)方式获取无限分类中所有的最后一层子节点数据
xiaoxiao
2021-04-12
35
$sql2
=
"select cfg.parent_id,cfg.depth,cfg.name,cfg.val,cfg.id from cfg_dictionaries as cfg where cfg.dict_id=103 and valid =1"
;
//查询数据库,获取到所有的数据
$res2
=
$this
->
$model
->query(
$sql2
);
$depth
=
0
;
//最大深度
//获取最大深度(注明:在数据库中存放有一个字段depth用来标记该记录所在的深度)
foreach
(
$res2
as
$key
=>
$val
){
$res2
[
$key
] =
$val
[
'cfg'
];
//如果当前记录中的depth大于$depth,则重新赋值$depth
if
(
$val
[
'cfg'
][
'depth'
]>
$depth
){
$depth
=
$val
[
'cfg'
][
'depth'
]; } }
// 按数组深度拆分查询结果(即:将深度为1的存放在一起,深度为2的存放在一起.....)
for
(
$i
=
1
;
$i
<=
$depth
;
$i
++){
foreach
(
$res2
as
$v
){
if
(
$v
[
'depth'
]==
$i
){
$cfArr
[
$i
][] =
$v
; } } }
//直接将最后一级节点取出(最大深度的数组中存放的肯定是最后一级节点,不会有子节点)
$gcsjArr
[] =
$cfArr
[
$depth
];
$pidArr
=
array
();
// //从最大深度(即最后一级节点)往前迭代,依次遍历出所有的父节点(所有含有子节点的节点)的id。从最后一层和倒数第二层进行比较,如果倒数第二层记录中的id等于最后一层的记录的父id(parent_id),则将该id(或parent_id)放入父id数组中
//第$depth,$depth-1,.....3,2层
for
(
$i
=
$depth
;
$i
>=
2
;
$i
--){
//第$depth-1,.....3,2,1层
for
(
$j
=
$i
-
1
;
$j
>=
1
;
$j
--){
//遍历第$i层中的所有记录
foreach
(
$cfArr
[
$i
]
as
$key1
=>
$value1
){
//遍历第$i-1层中的所有记录
foreach
(
$cfArr
[
$j
]
as
$key2
=>
$value2
){
//相连两层记录的数据进行比较
if
(
$value1
[
'parent_id'
]==
$value2
[
'id'
]){
//如果相同,则将该id存起来
$pidArr
[]=
$value1
[
'parent_id'
]; } } } } }
//逆序 逐层将没有子节点的数据放入新数组。从倒数第二层开始,如果该记录的id不在父id数组中,则说明该记录为最后一层
for
(
$j
=
$depth
-
1
;
$j
>=
1
;
$j
--){
foreach
(
$cfArr
[
$j
]
as
$key3
=>
$val3
){
if
(!in_array(
$val3
[
'id'
],
$pidArr
)){
$gcsjArr
[
0
][] =
$val3
; } } }
转载请注明原文地址: https://ju.6miu.com/read-667834.html
技术
最新回复
(
0
)