在 PHP DOM 中,递归函数获取元素/节点深度

Seb*_*ian 4 php recursion dom

我有以下函数,它通过递归调用自身将给定 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;

}
Run Code Online (Sandbox Code Playgroud)

我正在使用此函数解析 XML 节点。它可以具有任意数量的元素和子元素。这个想法是,每次函数进入递归时,我都会+1 深度变量。问题是,当我处于一个实际上并不深入的节点中,而是在树中时,我必须将变量设置为-1。因此,对于我当前所在的每个节点,我需要当前元素相对于在进入递归之前(!)传递给函数的 DOM 节点的深度。

wka*_*ann 5

如果您提供了所需的输出,问题会更清楚。深度参数可以按如下方式传递:

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;
}
Run Code Online (Sandbox Code Playgroud)

返回值可能不是您想要的,但您必须对此更加具体。


更新

据我了解,你的意思可能是这样的:

<?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;
}

?>
Run Code Online (Sandbox Code Playgroud)

如果仍然是其他问题,您应该提供示例输入和输出(始终是设计算法时的第一步。)