2017-05-11 152 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 }