2014-01-11 58 views
1

我有以下函數,它通過遞歸調用自身來讀取給定dom元素的所有子元素/文本節點到數組中。在PHP DOM中獲取遞歸函數中的元素/節點深度

它工作正常,但我需要每個節點(文本或元素)與第一個(!)給定DOM節點相關的深度,在發生任何遞歸之前。我無法弄清楚如何做到這一點,有什麼想法?

function recursively_find_text_nodes($dom_element) { 

    $return = array(); 

    foreach ($dom_element->childNodes as $dom_child) { 

     switch ($dom_child->nodeType) { 

      case XML_TEXT_NODE: 

       if (trim($dom_child->nodeValue) !== '') {     

        $return[] = $dom_child->nodeValue; 

       } 

      break; 

      case XML_ELEMENT_NODE: 

       $return = array_merge($return, $this->recursively_find_text_nodes($dom_child)); 

      break; 

     } 

    } 

    return $return; 

} 

我用這個函數解析XML節點。它可以有任何數量的元素和子元素。我的想法是,我+1一個深度變量,每次函數進入遞歸。問題是,當我在一個實際上並沒有深入的節點中,但在樹中,我必須-1變量。因此,對於我當前所在的每個節點,我需要關於DOM節點的當前元素的深度,該節點在進入遞歸之前已經傳遞給函數(!)。

回答

2

如果你提供了你想要的輸出,問題會更加清晰。深度參數可以傳遞如下:

function recursively_find_text_nodes($dom_element, $depth=1) { 

    $return = array(); 

    foreach ($dom_element->childNodes as $dom_child) { 

     switch ($dom_child->nodeType) { 

      case XML_TEXT_NODE: 
       if (trim($dom_child->nodeValue) !== '') { 
        $return[] = array (
         'depth' => $depth, 
         'value' => $dom_child->nodeValue 
        ); 
       } 
       break; 

      case XML_ELEMENT_NODE: 
       $return[] = array (
        'depth' => $depth, 
        'value' => $dom_child 
       ); 

       $return = array_merge($return, $this->recursively_find_text_nodes($dom_child, $depth+1)); 
       break; 
     } 
    } 

    return $return; 
} 

返回值可能不會是您預期的,但你必須要爲更具體。


更新

據我所知,你大概意思是這樣的:

<?php 

function recursively_find_text_nodes($dom_element, $depth=1, $predecessor_depth=0) { 

    $return = array(); 

    foreach ($dom_element->childNodes as $dom_child) { 

     switch ($dom_child->nodeType) { 

      case XML_TEXT_NODE: 
       if (trim($dom_child->nodeValue) !== '') { 
        $return[] = array (
         'absolute_depth' => $depth, 
         'relative_depth' => $depth - $predecessor_depth, 
         'value' => $dom_child->nodeValue 
        ); 

        $predecessor_depth = $depth; 
       } 
       break; 

      case XML_ELEMENT_NODE: 
       $return[] = array (
        'absolute_depth' => $depth, 
        'relative_depth' => $depth - $predecessor_depth, 
        'value' => $dom_child 
       ); 

       // Add the sub tree nodes to the result array 
       $child_return_value = $this->recursively_find_text_nodes($dom_child, $depth+1, $predecessor_depth); 
       $return = array_merge($return, $child_return_value); 

       // Determine the depth of the last one processed 
       $predecessor_depth = $return[count($return)-1]['absolute_depth']; 

       break; 
     } 
    } 

    return $return; 
} 

?> 

如果是別的東西還在,你應該提供例如輸入和輸出(總是當設計一個算法的第一步。)

+0

謝謝,這確實不是我的意圖。我更新了我的問題,以更好地解釋我的意思。 – Sebastian

+0

答案已更新。 – wkampmann