我正在解析文档上的DOMDocument,这些文档具有我感兴趣的h3
和li
标记的可预测结构。目前我正在使用此功能。
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
个标记。
答案 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;
}