2017-05-11 116 views
0

我想将一些DOM内容解析为多维数组。让我们假设,我有这样的HTML内容将DOM解析为多维数组PHP

<for model="customer" id="0" processed="0"> 
 

 
\t \t <tag model="customer" value="name">name</tag> 
 

 
\t \t <for model="accounts_receivable" processed="0"> 
 

 
\t \t \t <p>This is inside accounts_receivable</p> 
 

 
\t \t </for> 
 

 
\t </for>

我想解析这:

array(
 
    FOR => array (
 
    ATTRIBUTES => 
 
    SUBELEMENTS => array (
 
     FOR => array (
 
     ATTRIBUTES => 
 
     SUBELEMENTS => 
 
    ) 
 
    ) 
 
) 
 
)

我通过PHP与解析DOM试图与获取ElementsByTagName,但它返回两个数组中的标签。

重点是,该功能应该与2层或20层。

任何好主意?

干杯, 尼克拉斯

+0

_“关键的一点是,该功能应与2层或20层上班” _ - 那么,你很可能需要一个递归解决方案。 – CBroe

回答

0

我写了一个函数,做这行“的”标记的节点。它会忽略所有其他节点,但递归地解析所有for标签节点的完整DOM。

$doc->loadHTML($this->template, LIBXML_NOWARNING | LIBXML_NOERROR); 
 

 
$elements = $doc->getElementsByTagName('for'); 
 

 
$array = []; 
 

 
if (!is_null($elements)) { 
 
\t foreach ($elements as $element) { 
 
\t \t if($element->getAttribute("processed") == false || $element->getAttribute("processed") != 1){ 
 
\t \t \t array_push($array, $this->parseDomChild($element)); 
 
\t \t } 
 

 
\t } 
 
} 
 

 
function parseDomChild($element) { 
 

 
\t \t $array = []; 
 

 
\t \t if(isset($element->tagName) && $element->tagName == 'for') { 
 

 
\t \t \t $array['nodeSelf'] = $element; 
 
\t \t \t $element->setAttribute("processed", 1); 
 

 
\t \t } 
 

 
\t \t if($element->hasChildNodes()) { 
 

 
\t \t \t $array['nodesChild'] = []; 
 

 
\t \t \t foreach($element->childNodes as $node) { 
 

 
\t \t \t \t \t array_push($array['nodesChild'], $this->parseDomChild($node)); 
 

 
\t \t \t } 
 

 
\t \t } 
 

 
\t \t return $array; 
 

 
\t }