10

次の XML があります。

<account>
    <id>123</id>
    <email></email>
    <status>ACTIVE</status>
</account>

配列変数にしたい。したがって、私はそれを読んだ$xml = simplexml_load_file()。私が知っている simpleXMLElement を連想配列に変換する最も簡単な方法は、次のようにすることです。json_decode(json_encode((array) $xml),1);

email問題は、キーを空の配列としてではなく、NULL値として取得したくないことです。SimpleXMLElement としては、次のようになります。

public 'email' => 
    object(SimpleXMLElement)[205]

一方、配列では次のようになります。

'email' => 
    array (size=0)
      empty

私は取得したい:

'email' => NULL

私が考えたこれを達成する唯一の方法は、すべての要素を繰り返し処理し、空の配列を null 値に置き換えることです。問題は、私の XML がかなり大きく (上記は問題を説明するためのものです)、多くの XML 要素を反復処理する必要があることです (これは手動の作業になります。自動化されたものを探しています)。関数の 1 つでいくつかのオプションが欠落している可能性があります... または、これを行うための別のトリックがあるのでしょうか?

4

3 に答える 3

9

コメントを追加することはできませんが、これでうまくいくと思います。正規表現やループよりも高速になるはずです。

//after you json_encode, before you decode
$str = str_replace(':[]',':null',json_encode($array));

JSON の空の配列は " " で表されます[]。配列がオブジェクトとして解析される場合があります。その場合 (またはフォールバックとして)、" :{}" も置き換えることができます。

于 2013-02-27T09:27:14.400 に答える
0

str_replace と再帰ループのパフォーマンスを確認する

  • 反復: 100000
  • XML の長さ: 4114 バイト
  • 初期化スクリプト時間: ~1.2264486691986E-6 秒
  • JSON エンコード/デコード時間: ~9.8956169957496E-5 秒
  • str_replace平均時間: 0.00010692856433176
  • 再帰ループの平均時間: 0.00011844366600813

str_replace は ~0.00001 秒ですばやく置き換えられます。違いは多くの呼び出しで顕著になります

于 2016-10-27T10:12:35.910 に答える