我有以下函数,它通过递归调用自身将给定 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 节点的深度。
如果您提供了所需的输出,问题会更清楚。深度参数可以按如下方式传递:
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)
如果仍然是其他问题,您应该提供示例输入和输出(始终是设计算法时的第一步。)
| 归档时间: |
|
| 查看次数: |
2620 次 |
| 最近记录: |