Php 如何使用simpleXML将树解析为嵌套数组?
我正在编写一个PHP脚本,该脚本从第三方API(订单管理系统)请求xml数据:客户订单,由于主API调用不能正常工作(而且他们也不打算修复),因此我获得所需数据的唯一方法是使用一个调用,该调用将其作为jstree返回(html:ul LIA)格式如下:Php 如何使用simpleXML将树解析为嵌套数组?,php,arrays,parsing,xml-parsing,simplexml,Php,Arrays,Parsing,Xml Parsing,Simplexml,我正在编写一个PHP脚本,该脚本从第三方API(订单管理系统)请求xml数据:客户订单,由于主API调用不能正常工作(而且他们也不打算修复),因此我获得所需数据的唯一方法是使用一个调用,该调用将其作为jstree返回(html:ul LIA)格式如下: <ul> <li> <a>Order</a> <ul> <li> <a>Id</a&
<ul>
<li>
<a>Order</a>
<ul>
<li>
<a>Id</a>
<ul>
<li>13390</li>
</ul>
</li>
<li>
<a>OrderNumber</a>
<ul>
<li>13390</li>
</ul>
</li>
<li>
<a>LineItems</a>
<ul>
<li>
<a>LineItem</a>
<ul>
<li>
<a>Id</a>
<ul>
<li>21598</li>
</ul>
</li>
<li>
<a>Subtotal</a>
<ul>
<li>45.79</li>
</ul>
</li>
<li>
<a>SubtotalTax</a>
<ul>
<li>9.16</li>
</ul>
</li>
<li>
<a>Total</a>
<ul>
<li>45.79</li>
</ul>
</li>
<li>
<a>TotalTax</a>
<ul>
<li>9.16</li>
</ul>
</li>
<li>
<a>Price</a>
<ul>
<li>45.79</li>
</ul>
</li>
<li>
<a>Quantity</a>
<ul>
<li>1</li>
</ul>
</li>
<li><a>TaxClass</a></li>
<li>
<a>Name</a>
<ul>
<li>Product Name</li>
</ul>
</li>
<li>
<a>ProductId</a>
<ul>
<li>4208</li>
</ul>
</li>
<li>
<a>Sku</a>
<ul>
<li>ABCD-S</li>
</ul>
</li>
<li><a>Meta</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
但它输出的数组如下所示:
Array
(
[0] => Array
(
[0] => Array
(
[0] => 13390
)
[1] => Array
(
[0] => 13390
)
[2] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 21598
)
[1] => Array
(
[0] => 45.79
)
[2] => Array
(
[0] => 9.16
)
[3] => Array
(
[0] => 45.79
)
[4] => Array
(
[0] => 9.16
)
[5] => Array
(
[0] => 45.79
)
[6] => Array
(
[0] => 1
)
[7] =>
[8] => Array
(
[0] => Product Name
)
[9] => Array
(
[0] => 4208
)
[10] => Array
(
[0] => ABCD-S
)
[11] =>
)
)
Array
(
["Order"] => Array
(
["Id"] => 13390
["OrderNumber"] => 13390
["LineItems"] => Array
(
[0] => Array
(
["Id"] => 21598
["Subtotal"] => 45.79
["SubtotalTax"] => 9.16
["Total"] => 45.79
["TotalTax"] => 9.16
["Price"] => 45.79
["Quantity"] => 1
["TaxClass"] =>
["Name"] => Product Name
["ProductId"] => 4208
["Sku"] => ABCD-S
["Meta"] =>
)
)
)
)
我期望的结果是数组的外观如下所示:
Array
(
[0] => Array
(
[0] => Array
(
[0] => 13390
)
[1] => Array
(
[0] => 13390
)
[2] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 21598
)
[1] => Array
(
[0] => 45.79
)
[2] => Array
(
[0] => 9.16
)
[3] => Array
(
[0] => 45.79
)
[4] => Array
(
[0] => 9.16
)
[5] => Array
(
[0] => 45.79
)
[6] => Array
(
[0] => 1
)
[7] =>
[8] => Array
(
[0] => Product Name
)
[9] => Array
(
[0] => 4208
)
[10] => Array
(
[0] => ABCD-S
)
[11] =>
)
)
Array
(
["Order"] => Array
(
["Id"] => 13390
["OrderNumber"] => 13390
["LineItems"] => Array
(
[0] => Array
(
["Id"] => 21598
["Subtotal"] => 45.79
["SubtotalTax"] => 9.16
["Total"] => 45.79
["TotalTax"] => 9.16
["Price"] => 45.79
["Quantity"] => 1
["TaxClass"] =>
["Name"] => Product Name
["ProductId"] => 4208
["Sku"] => ABCD-S
["Meta"] =>
)
)
)
)
当$li->a不是空的,但我只是以错误和空数组结束时,我尝试将$output[]=
替换为$output[$li->a]=
任何帮助都将不胜感激
谢谢,这里的主要变化只是处理XML的循环
foreach ($ul->li as $li) {
$newLayer = (isset($li->ul)) ? ul_to_array($li->ul) : trim((string) $li);
$output[ (string)$li->a ] = $newLayer[''] ?? $newLayer;
}
(string)$li->a
部分使用锚定标记中的值作为数组的索引
$newLayer[“”]$newLayer
处理存储实际值的实例,因此值位于元素''
中,如果未设置此元素,则它将是一个子菜单
根据您的示例,这将给出
Array
(
[Order] => Array
(
[Id] => 13390
[OrderNumber] => 13390
[LineItems] => Array
(
[LineItem] => Array
(
[Id] => 21598
[Subtotal] => 45.79
[SubtotalTax] => 9.16
[Total] => 45.79
[TotalTax] => 9.16
[Price] => 45.79
[Quantity] => 1
[TaxClass] =>
[Name] => Product Name
[ProductId] => 4208
[Sku] => ABCD-S
[Meta] =>
)
)
)
)
太好了,非常感谢奈杰尔。完全符合我的要求。