从 DOMDocument 填充 PHP 中的多维数组


Filling Multidimensional Array in PHP from DOMDocument

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

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

或者,如果有更简单的方法可以做到所有这些,我对任何事情都持开放态度。 数据结构将始终具有由h3标记分隔的li标记。

将以下内容用于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;  
}