Php 走路会出毛病

Php 走路会出毛病,php,dom,Php,Dom,我有一个简单的DOM遍历函数,我已经使用过几次了 这是一个简化版本: function walk\u DOM(&$DOM,&$node,$func){ $args=数组(&$node,&$dom); 调用用户函数数组($func,$args); 如果($node->nextSibling!==null){ walk_DOM($DOM,$node->nextSibling,$func); } 如果($node->hasChildNodes()){ $children=nodeList\u to\u

我有一个简单的DOM遍历函数,我已经使用过几次了

这是一个简化版本:

function walk\u DOM(&$DOM,&$node,$func){
$args=数组(&$node,&$dom);
调用用户函数数组($func,$args);
如果($node->nextSibling!==null){
walk_DOM($DOM,$node->nextSibling,$func);
}
如果($node->hasChildNodes()){
$children=nodeList\u to\u数组($node->childNodes);
walk_DOM($DOM,$children[0],$func);
}
}
我开始怀疑它的价值。我最近使用了一个新函数作为$func参数。它只允许“#text”节点和“p”节点渲染

该职能是:

功能条测试(&$node,&$dom){
if(($node->nodeName!=='p')&&
($node->nodeName!='#text')&&
($node->nodeName!=='body')){
如果($node->parentNode!==null){
$parent=$node->parentNode;
$parent->removeChild($node);
}
}
}
Walk_DOM()停止,而不查看所有节点。保留的节点仍然存在于DOM中。他们只是从来没有被评估过

那么,我来回答这个问题。这项技术有什么明显的问题吗?如果没有,是否有调试DOM问题的好方法

我已经跟踪了walk_DOM()访问的节点,发现它所覆盖的部分和之前停止的部分没有区别

在以前的使用中,我发现了这一点。虽然它很简单,但它不双重检查任何节点,并且以前已经覆盖了整个DOM

编辑:

要清楚的是,当我说“停止而不查看”时,我的意思是在(任意)50个节点的列表中,有0到3层子节点。此函数将解析其中的25%,然后停止。它解析的最后一个节点是DOM主体的直接后代


这两个函数也不会抛出错误。

当您的意思是“停止而不查看所有节点”时,您的意思是在更深层次的递归中,某些节点被忽略了吗?或者递归完全停止了。没错,但是多余——对象总是(有效地)通过引用传递,不需要显式引用。我还注意到,您正在迭代任何给定节点的第一个子节点(
$children[0]
)-您是否应该执行
foreach($childrenas$child){walk_DOM($DOM,$child,$func);}
?在这种情况下,您可能会放弃
nodeList\u to_array
函数,因为
DOMNodeList
可以直接迭代。foreach将导致节点被多次查看,但感谢您提供的by reference信息。