2017-05-11 4 views
0

DOMコンテンツを多次元配列に構文解析する必要があります。私はPHP経由でDOMを解析してみましたDOMを多次元配列にパースするPHP

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

:想定することができます、私はこのHTMLコンテンツ

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

を持っている私は、これを解析したいと思いますElementsByTagNameを取得しますが、配列のタグの2つを返します。

重要な点は、関数が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 }