从DOMDocument填充PHP中的多维数组

时间:2014-12-23 04:56:32

标签: php arrays multidimensional-array

我正在解析文档上的DOMDocument,这些文档具有我感兴趣的h3li标记的可预测结构。目前我正在使用此功能。

function showDOMNode(DOMNode $domNode) {
    foreach ($domNode->childNodes as $node)
    {
            $myName = preg_replace('/(\s)+/', ' ', $node->nodeName);
            $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue);
            if ($myName=="h3" or $myName=="li" ){
                $myText = $myName.":".$myValue;
                print $myText;
                echo"\n";
            }
        if($node->hasChildNodes()) {
            showDOMNode($node);
        }
    }   
}

这给出了

的好输出
h3:Category1 
li: Apple
li: Banana 
h3:Category2 
li: Ant 
h3:Category3
li: Alaska 
h3:Category4
li: Albania 
li: Bahamas 

但是想以某种方式把它放到一个多维数组中。 $myArray[][]其中第一个维度为h3值,li值放入相应的h3数组中。

function showDOMNode(DOMNode $domNode, $arrayToFill) {
    foreach ($domNode->childNodes as $node)
    {
            $myName = preg_replace('/(\s)+/', ' ', $node->nodeName);
            $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue);
            if ($myName=="h3" or $myName=="li" ){
                //somehow insert $myValue into $arrayToFill maybe???
            }
        if($node->hasChildNodes()) {
            showDOMNode($node,$arrayToFill);
        }
    }  
    return $arrayToFill;  
}

或者如果有更容易的方法来完成所有这些,我会对任何事情持开放态度。数据结构将始终以li标记分隔h3个标记。

1 个答案:

答案 0 :(得分:1)

将此用于somehow insert $myValue代码:

if ($myName == "h3") {
    if (!isset($arrayToFill[$myValue])) {
        $arrayToFill[$myValue] = array();
    }
    $curElement = $myValue;
} elseif ($myName == "li") {
    $arrayToFill[$curElement][] = $myValue;
}

这应返回如下数组:

[ "Category1" => [ "Apple", "Banana" ],
  "Category2" => [ "Ant" ],
  "Category3" => [ "Alaska" ],
  "Category4" => [ "Albania", "Bahamas" ]
]

此外,当您执行递归调用时,您还没有获取返回的数组:

$arrayToFill = showDOMNode($node, $arrayToFill);

您也可以通过引用$arrayToFill参数来解决此问题:

function showDOMNode(DOMNode $domNode, &$arrayToFill) {

然后在调用者中看到对函数中数组的修改。

我们还需要将$curElement传递给递归调用。我也将此作为参考传递给它,以便对它的更新将反映在调用者中。

function showDOMNode(DOMNode $domNode, &$arrayToFill, &$curElement = null) {
    foreach ($domNode->childNodes as $node)
    {
            $myName = preg_replace('/(\s)+/', ' ', $node->nodeName);
            $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue);
            if ($myName == "h3") {
                if (!isset($arrayToFill[$myValue])) {
                    $arrayToFill[$myValue] = array();
                }
                $curElement = $myValue;
            } elseif ($myName == "li") {
                $arrayToFill[$curElement][] = $myValue;
            }
        if($node->hasChildNodes()) {
            showDOMNode($node, $arrayToFill, $curElement);
        }
    }  
    return $arrayToFill;  
}