0

这是我尝试过的,但数字是错误的,我不知道为什么

在此处输入图像描述

它应该是 1、2、3、4、5 等等。

这是我的PHP代码:

function GetNavigations(SimpleXMLElement $element, $level = 0, $mrg = 0)
{   
    $value = trim((string) $element); 
    $children = $element->children(); 
    $attributes = $element->attributes();
    //echo '<ul>';  
    if(count($children) == 0 && !empty($value))
    {   
    if($element->getName() == 'GroupName')
        {
            if($attributes['ParentId'] != '')
            {
                //$mrg = $level/2 * 10;
                echo '<li>'.$mrg.'<a class="btngroup" href="load.php?active=menu&group_name_id='.$attributes['GroupNameId'].'">'.$element.'</a></li>';
            }   
        }
    }

    if(count($children))
    {
        foreach($children as $child)
        {
            GetNavigations($child, $level+1, $mrg+1);
        } 
    }
    //echo '</ul>';
}
4

1 回答 1

1

GetNavigations($child, $level+1, $mrg+1)将相同的值传递$mrg给一个节点的所有子节点,无论它有多少子节点,因为$mrg在该循环内的其他任何地方都没有改变。而不是$mrg+1,您可以通过++$mrg- 或者更具可读性,添加$mrg++;为之前的行,然后通过$mrg

但是,您仍然会遇到问题,该函数只知道显示了多少直接子代,而不知道有多少后代 - 如果您GetNavigations使用 的$mrg值调用2,并且它显示 20 个嵌套项,那么您的下一个值$mrg将是3,而不是23!尽管它们都具有相同的名称,但每次运行该函数时,都会有一个新$mrg变量。

为了解决这个问题,您可以:

  • 通过$mrg引用传入(通过将函数声明更改为function GetNavigations(SimpleXMLElement $element, $level = 0, &$mrg)添加&,以便函数的所有副本都可以写入同一个变量。
  • $mrg将out的新值作为函数的值传递return

我可能更喜欢第二种方法,因为任何阅读代码的人都更清楚发生了什么:

function GetNavigations(SimpleXMLElement $element, $level = 0, $mrg = 0)
{   
    /* [snip] */

    if($element->getName() == 'GroupName')
    {
            // Increment counter, because we're displaying something
            $mrg++;

            /* [snip] */
    }

    /* [snip] */

    if(count($children))
    {
        foreach($children as $child)
        {
            // Recurse, and get incremented value of counter
            $mrg = GetNavigations($child, $level+1, $mrg);
        } 
    }

    /* [snip] */

    // Let caller know where the counter has got to
    return $mrg;
}
于 2013-02-16T21:47:19.127 回答