2013-02-16 60 views
0

這是我做過嘗試,但這些數字是錯誤的,我不知道爲什麼如何從PHP中的遞歸函數中計算xml的元素?

enter image description here

它應該是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>'; 
} 

回答

1

GetNavigations($child, $level+1, $mrg+1)會的$mrg相同的值傳遞到一個節點的所有孩子,但是很多孩子有,因爲$mrg並未正在改變其他地方在那個循環裏面。而不是$mrg+1,你可以通過++$mrg - 或更易讀,加$mrg++;作爲行之前,只是通過$mrg

但是,你仍然會有該功能只知道有多少直接孩子已經顯示,沒有多少後代的問題 - 如果你打電話GetNavigations2一個$mrg價值,並顯示20個嵌套項目,你的下一個$mrg的值將爲3,而不是23!儘管它們都具有相同的名稱,但每次運行該功能時,都會有一個新的$mrg變量。

要解決這個問題,你可以:

  • $mrg通過引用(通過改變函數聲明爲function GetNavigations(SimpleXMLElement $element, $level = 0, &$mrg)與添加的&,使功能的所有複印件都寫入同一變量。
  • $mrg新值了作爲函數的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; 
} 
+0

我明白了,謝謝主席先生:d – MekeniKine 2013-02-17 00:28:04

+0

先生itried但它始終顯示「1」,或者也許我的代碼是錯在這裏是「$我= GetNavigations($ xml,0,$ i);「 – MekeniKine 2013-02-17 00:35:50