Php 如何将dom节点转换为数组?

Php 如何将dom节点转换为数组?,php,dom,Php,Dom,我有一个函数,它获取dom节点并从中创建一个数组。 但它只给出了页面的一部分,我认为是关于兄弟姐妹的,但没有找到如何修改它: function nodeToArray( $dom, $node) { if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) { return false; } $array = false; if( empty( trim( $node->lo

我有一个函数,它获取dom节点并从中创建一个数组。 但它只给出了页面的一部分,我认为是关于兄弟姐妹的,但没有找到如何修改它:

function nodeToArray( $dom, $node)
{
    if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
        return false;
    }
    $array = false; 
    if( empty( trim( $node->localName ))) {// Discard empty nodes
        return false;
    }
    if( XML_TEXT_NODE == $node->nodeType ) {
        return $node->nodeValue;
    }
    foreach ($node->attributes as $attr) { 
        $array['@'.$attr->localName] = $attr->nodeValue; 
    } 
    foreach ($node->childNodes as $childNode) { 
        if ( 1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) { 
            $array[$childNode->localName] = $childNode->nodeValue; 
        }  else {
            if( false !== ($a = nodeToArray( $dom, $childNode))) {
                $array[$childNode->localName] =     $a;
            }
        }
    }
    return $array; 
}

$dom = new DOMDocument();
$dom->loadHTML($response);
$a=nodeToArray($dom,$dom->getElementsByTagName("body")->item(0));
print "<pre>";
print_r($a);
print "</pre>";
函数nodeToArray($dom,$node)
{
如果(!is_a($dom,'DOMDocument')| |!is_a($node,'DOMNode')){
返回false;
}
$array=false;
if(空(修剪($node->localName)){//放弃空节点
返回false;
}
if(XML\u TEXT\u NODE==$NODE->nodeType){
返回$node->nodeValue;
}
foreach($node->属性为$attr){
$array['@'.$attr->localName]=$attr->nodeValue;
} 
foreach($node->childNodes作为$childNode){
如果(1=$childNode->childNodes->length&&XML\u TEXT\u NODE==$childNode->firstChild->nodeType){
$array[$childNode->localName]=$childNode->nodeValue;
}否则{
if(false!==($a=nodeToArray($dom,$childNode))){
$array[$childNode->localName]=$a;
}
}
}
返回$array;
}
$dom=新的DOMDocument();
$dom->loadHTML($response);
$a=nodeToArray($dom$dom->getElementsByTagName(“正文”)->item(0));
打印“”;
印刷费($a);
打印“”;

谢谢

您能找出问题并向我们展示什么不适用于示例输入,而不是删除随机代码片段吗?childnodes循环将只保存遇到的任何特定节点的最后一个。如果您在其中有(比如)6个
标记,您将覆盖从节点1->5保存的内容,并且只在其中留下6个。