PHP でネスト構造の XML(SimpleXMLElement)を、再帰処理で配列に変換
はじめに
PHP でネスト構造の XML(SimpleXMLElement
)を、再帰処理で配列(array
)に変換する方法を整理した。
TL;DR
get_object_vars
で変換できるのは1階層目までforeach
と組み合わせて再帰処理で解決json_decode
,json_encode
,simplexml_load_string
の組み合わせでも OK
目次
環境・条件
1 | $ grep -i pretty /etc/os-release |
詳細
get_object_vars による変換
単純構造
get_object_vars
を使うと、XML(SimpleXMLElement
) を配列に変換できる。
以下のような XML を変換してみる。
1 | <foo> |
以下のように特に問題なし。
1 | $xml_str = '<foo><bar>1</bar><baz>hoge</baz></foo>'; |
ネスト構造の変換
続いて下記のようなネスト構造の XML を変換してみる。
1 | <foo> |
以下の通り、1階層目までは変換できているが、2階層目以降は SimpleXMLElement
のままとなっている。
1 | $xml_str = '<foo><bar>1</bar><baz><hoge><fuga>piyo</fuga><cat>meow</cat></hoge></baz></foo>'; |
再帰処理で解決
get_object_vars
のコメント を参考に作成した。
get_object_vars
で変換後、各要素に対して foreach
で処理。$value
がオブジェクト(= XML)の場合は再帰呼び出し。
1 | function xml_to_array($xml) { |
処理結果は下記
1 | xml_to_array($xml) |
懸念点
再帰呼び出ししてるので、巨大な XML とか、ネストがめちゃくちゃ深い XML とかを処理しきれるかは不明。
スタックオーバーフローとか発生するかも?
json_decode, json_encode, simplexml_load_string の組み合わせで解決
php - Recursive cast from SimpleXMLObject to Array - Stack Overflow のコメントの方法でもできる。
json_decode
, json_encode
, simplexml_load_string
の組み合わせ。
1 | json_decode(json_encode((array) simplexml_load_string($xml_str)), 1); |
まとめ
get_object_vars
で変換できるのは1階層目までforeach
と組み合わせて再帰処理で解決json_decode
,json_encode
,simplexml_load_string
の組み合わせでも OK
参考文献
- PHP: SimpleXMLElement - Manual
- PHP: 配列 - Manual
- PHP: get_object_vars - Manual
- php - Recursive cast from SimpleXMLObject to Array - Stack Overflow
- PHP: simplexml_load_string - Manual
- PHP: json_encode - Manual
- PHP: json_decode - Manual
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- PhpSpreadsheet を使って PHP で Excel ファイルの操作(読み込み)
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア