织梦获取子栏目递归逻辑函数GetSonIdsLogic()分析

admin2019-12-201196

函数名:GetSonIdsLogic()

所在文件:include/helpers/channelunit.helper.php

原理分析:

function GetSonIdsLogic($id,$sArr,$channel=0,$addthis=false)
{
    if($id!=0 && $addthis)
    {
     $GLOBALS['idArray'][$id] = $id;
    }
    if(is_array($sArr))
    {
        foreach($sArr as $k=>$v)
        {
            if( $v[0]==$id && ($channel==0 || $v[1]==$channel ))
            {
                GetSonIdsLogic($k,$sArr,$channel,true);
            }
        }
    }
}

其实,在文件channelunit.helper.php里面,这个函数是为了织梦函数GetSonIds()服务的,或者说函GetSonIds()在获取子栏目时,调用了这个递归逻辑函数。

我们以文件/data/cache/inc_catalog_base.inc里面的数据,也就是后台栏目为例子。

文件inc_catalog_base.inc内容如下:

<?php
global $cfg_Cs;
$cfg_Cs=array();
$cfg_Cs[19]=array(18,1,1,'aHRtbA==');
$cfg_Cs[18]=array(0,1,1,'572R6aG15Z+656GA');
$cfg_Cs[17]=array(0,1,1,'5bCP6K+0');
$cfg_Cs[13]=array(0,-8,1,'5rG96L2m');
$cfg_Cs[14]=array(0,-8,1,'54Gr6L2m');
?>

从这个文件我们不难发现,其实,id为18的栏目有一个子栏目,这个子栏目id为19,这时要想获得id为18的栏目的子栏目id就要用到这个递逻辑函数了。

id为18的栏目在对应后台如下图所示。

从上图可以,id为18的栏目对应的栏目为“网页基础”,这个栏目确定有子栏目id为19,即“html”栏目。

源码分析:

我们就以id=18为例子,来分析一下这个递归逻辑。

1、第一个条件:

if($id!=0&&$addthis)

{

$GLOBALS['idArray'][$id]=$id;

}

这个条件的目的是把id为18,19存入数组$GLOBALS['idArray']里面,键和值相同。

2、if(is_array($sArr)),判断$sArr是不是数组,即判断$cfg_Cs是不是数组。

3、foreach($sArr as$k=&gt;$v),遍历,此时的$k为$cfg_Cs[18]里面的18,$v是数组array(0,1,1,'572R6aG15Z+656GA')。

4、条件判断:if($v[0]==$id&&($channel==0||$v[1]==$channel)),此时,执行到$cfg_Cs[18]时,$v[0]=0并不等于$id=18。所以,并不执行下面的代码,即,并不进行递归调用。当执行到$cfg_Cs[19]时,此时,我们遍历的是$v[0]=18。

注意:此时的$id仍然是18,而不是19,这是非常容易弄错的,因为,上一次foreach后,并没有进入递归,所以,这个$id值没有变,仍然为18,所以,此时$v[0]=18,且$v[1]=$chaanel,即$v[1]=1。

$v[0]=18,也就是reid=18,这就说明$cfg_Cs[18]是$cfg_Cs[19]的上级栏目。

$v[1]=$chaanel说明,它们是同一个模型。

通过上面这二个条件就确定了栏目“html”是“网页基础”的子栏目,有了子栏目就要进行递归,调用自身函数GetSonIdsLogic($k,$sArr,$channel,true),此时,再回到第一个条件里面,此时,$id=19了,并把19存入数组$GLOBALS['idArray']里面,此时,这个数组的值为:

$GLOBALS['idArray'][18]=18

$GLOBALS['idArray'][19]=19

接下来再判断$v[0]是否等于19,从文件inc_catalog_base.inc文件可知,再也没有等于19的了,所以,并不进入递归,数组$GLOBALS['idArray']中只有二个值18,19。

本例子是以$id=18为例子,为了完整说明递归逻辑的调用,本例也在适当位置加入了其它调用示例。

实验:

为了对本递归函数进行验证我们分析的是否正确,我们在文件/dede/catalog.do.php加入如下代码:

helper(channelunit);

echo GetSonIds(18);

exit("不能删除!");

到后台删除“网页基础”栏目,得到的结果如下图所示。

从上图可以知道,18,19正是“网页基础”和“html”栏目。

网友评论