织梦获取子栏目递归逻辑函数GetSonIdsLogic()分析
函数名: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=>$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”栏目。