我正在解析具有我感兴趣的h3
和li
标签的可预测结构的文档上的 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;
}