好的,所以我有一个问题,我要从API中提取数据库,并且结构返回如下:
<Response id="responceidgoeshere">
<block name="addresses">
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="sub-premise" format="text">#SUB-PREM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text">#REF#</a>
<a name="csscode" format="text">#CSS#</a>
</block>
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text"/>
<a name="csscode" format="text"/>
</block>
</block>
</Response>
但是,您可以看到结果之间的数据略有不同,具体取决于地址。 当我使用simpleXML转换为PHP数组时,结果如下:
编辑:包括转换方法:
$xml=simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json=json_encode($xml);
$array=json_decode($json,TRUE);
结果:
[0] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #SUB-PREM#
[2] => #STREET#
[3] => #LOCAL#
[4] => #CITY#
[5] => #POSTCODE#
[6] => #REF#
[7] => #CSS#
)
[1] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #STREET#
[2] => #LOCAL#
[3] => #CITY#
[4] => #POSTCODE#
[5] => #REF#
[6] => #CSS#
)
理想情况下,我需要一种以“名称” attr作为键来创建PHP数组的方法。有没有人知道最好的方法,因为标准的simpleXML太不符合我的需要,因为永远不会有一个子premice元素,有时也会有一个County元素。
编辑:所需结构的示例:
[0]=array
(
[a]=array
(
['building'] => #NAME/NUM#,
['sub-premise'] => #SUB-PREM#,
['street'] => #STREET#,
etc...
)
)
答案 0 :(得分:2)
使用SimpleXMLElement
或使用json_decode/encode
进行强制转换将(array)
对象转换为数组几乎总是会导致数据丢失(尤其是XML属性)。您会发现尝试使用其本机API来访问它们要容易得多,而不是盲目地将它们转换为其他内容。
您可以通过以下方法很容易地实现您需要做的事情:遍历元素,并构建一个由name
属性索引的数组:
$result = [];
foreach ($sxml->block->block as $block) {
$row = [];
foreach ($block->a as $a) {
$row[(string) $a['name']] = (string) $a;
}
$result[] = $row;
}