PHP无限级分类学习参考解析带详细注释的ecshop无限级
复制代码代码如下所示:功能cat_options(spec_cat_id美元美元,ARR)
{
静态cat_options美元=阵();
如果(isset($ cat_options { $ spec_cat_id }))
{
返回的cat_options { $ spec_cat_id };
}
*
初始化关键参数:
$:当前子节点深度
last_cat_id美元:当前父节点ID
$选项:带有缩进级别数组
cat_id_array美元:驻扎在沿同一路径的父节点序列
level_array美元:该节点的子节点的深度也在变。
* /
如果(!isset($ cat_options { 0 }))
{
last_cat_id美元= 0美元水平=;
美元美元美元cat_id_array选项= = level_array =阵();
而(!空($ ARR)) / /如果有将继续节点遍历
{
foreach(ARR美元美元美元的价值关键=)
{
cat_id美元=美元的价值'cat_id'} {;
分类节点
如果($ = = = = 0美元last_cat_id 0级)
{
如果(美元价值{ 'parent_id} > 0)
{
打破;
}
选择cat_id } = {美元美元美元的价值;
选择{ } { cat_id美元美元'level} = $水平;
选择{ } {美元美元cat_id 'id' } = $ cat_id;
选择{ } {美元美元cat_id 'name' } = { } 'cat_name美元的价值;
我不能遍历/遍历
unset($ ARR { $关键});
如果(美元价值{ 'has_children} = 0)
{
继续;
}
last_cat_id美元=美元cat_id; / /父节点的下游节点
cat_id_array美元=阵列($ cat_id);
level_array美元{ $ last_cat_id } = + + $水平;
继续;
}
当前节点的id父节点是其id的一个节点。
如果(美元价值{ 'parent_id} = $ last_cat_id)
{
选择cat_id } = {美元美元美元的价值;
选择{ } { cat_id美元美元'level} = $水平;
选择{ } {美元美元cat_id 'id' } = $ cat_id;
选择{ } {美元美元cat_id 'name' } = { } 'cat_name美元的价值;
unset($ ARR { $关键}); / /没有遍历
如果当前节点是一个子节点,则要输入当前节点,而不是反过来不遍历;也不能遍历。
如果(美元价值{ 'has_children} > 0)
{
如果(端($ cat_id_array)!= $ last_cat_id)
{
cat_id_array { } = last_cat_id美元美元;
}
last_cat_id美元=美元cat_id; / /当我们做为新的父节点下一级节点
cat_id_array美元{ } = $ cat_id; / /
level_array美元{ $ last_cat_id } = + + $ / /水平;节点的节点的深度
}
}
(美元价值{ 'parent_id} > last_cat_id美元)
{如果当前节点大于父节点深度的下一轮循环的当前深度
打破;
}
} / / php endforeach
$count =计数($ cat_id_array);
如果(计数1)
{
删除父节点中最后一个父节点作为父节点
last_cat_id = array_pop美元(美元cat_id_array);
}
elseif($count = 1)
{
如果(last_cat_id美元!=端($ cat_id_array))
{
在父节点中,父节点只有一个节点,而不是父节点。
last_cat_id美元(美元cat_id_array)=结束;
}
其他的
{否则,最后退出父节点必须是一个分类节点。
$ = 0;
last_cat_id = 0美元;
cat_id_array美元=阵();
继续;
}
}
如果($ last_cat_id isset($ level_array { $ last_cat_id }))
{
当前节点的深度
美元美元美元last_cat_id level_array水平= { };
}
其他的
{
$ = 0;
}
} / /结束的时候,在这个时候,我们已经完成了构建非递归前序遍历树的工作,其中$选项与从根节点的所有节点的层次性保存。
为cat_options { 0 } = $选项;
}
其他的
{
选择cat_options美元美元= { 0 };
}
如果整个树被直接从0返回。
如果(!spec_cat_id美元)
{
返回$选项;
}
从指定的节点开始,否则截取,下面简单的我还是一点,就说几个参数吧。
*
spec_cat_id_level美元的深度:截取节点
商品分类树,最后由spec_cat_id_array美元返回:以节点为根节点
最终返回的数组是这样的排序:根据父节点的大小,根据父父节点,遍历同一父节点的第一个根,并举例说明:
第一级节点有1,5两节点三节点2,6,7 8,9,如果1的直接子是2,6和2的直接孩子8,9;
5的直接孩子是7,最后的数组是这样的1 - 2 - 8 - 9 - 6 - 5 - 7。
* /
其他的
{
如果(空($选项{ $ spec_cat_id }))
{
返回数组();
}
spec_cat_id_level美元=美元spec_cat_id } { 'level选项{ $'};
foreach(美元美元美元的价值选择的关键=)
{
如果(键)!= $ spec_cat_id)
{
撤消($选项{ $关键});
}
其他的
{
打破;
}
}
spec_cat_id_array美元=阵();
foreach(美元美元美元的价值选择的关键=)
{
如果(($ spec_cat_id_level = =价值{ 'level'} { } = 'cat_id美元价值的美元spec_cat_id | |!)
($ spec_cat_id_level >价值'level{ }))
{
打破;
}
其他的
{
spec_cat_id_array美元美元美元价值的关键} = {;
}
}
cat_options美元美元美元spec_cat_id_array spec_cat_id } = {;
返回的spec_cat_id_array;
}
}