当简单 XML 不准确时 XML 到 PHP 数组

XML to PHP array when simpleXML isn't acurate

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

理想情况下,我需要一种方法来创建一个以 "name" 属性作为键的 PHP 数组。有谁知道执行此操作的最佳方法,因为标准的 simpleXML 对我的需要来说太不一致了,因为不会总是有 sub premice 元素,有时也会有 county 元素。

编辑:所需结构示例:

[0]=array
(
   [a]=array
   (
       ['building'] => #NAME/NUM#,
       ['sub-premise'] => #SUB-PREM#,
       ['street'] => #STREET#,
       etc...
   )
)

使用 json_decode/encode 或使用 (array)SimpleXMLElement 对象转换为数组几乎总是会丢失数据(尤其是 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