当simpleXML不准确时,将XML转换为PHP数组

时间:2018-08-21 16:06:22

标签: php xml simplexml

好的,所以我有一个问题,我要从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...
   )
)

1 个答案:

答案 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;
}

请参见https://3v4l.org/mBoFO