将DOM解析为多维数组PHP

时间:2017-05-11 08:05:47

标签: php dom multidimensional-array

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

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

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

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

			<p>This is inside accounts_receivable</p>

		</for>

	</for>

我想解析一下:

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

我尝试使用获取ElementsByTagName通过PHP解析DOM,但是它返回了两个用于数组中的标记。

关键点是,该功能应该适用于2层或20层。

有什么好主意吗?

干杯, 尼古拉斯

1 个答案:

答案 0 :(得分:0)

我写了一个函数,为“for”标记节点执行此操作。它忽略了所有其他节点,但递归地解析了所有for标记节​​点的完整DOM。

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

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

$array = [];

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

	}
}

function parseDomChild($element) {

		$array = [];

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

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

		}

		if($element->hasChildNodes()) {

			$array['nodesChild'] = [];

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

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

			}

		}

		return $array;

	}