SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】XMLを配列に変換する

問題

phpで、XMLを配列に変換したいです!そんな便利な関数ありますか?

php-logo

答え

名前空間ありのXMLだとそうもいかないけど、単純なXMLの場合、以下3行でとても良い感じに配列になる。

$x = simplexml_load_string($xml);
$j = json_encode($x);
$a = json_decode($j, true);

無理やり1行にすると、

json_decode(json_encode(simplexml_load_string($xml)), true);

<?php

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<テスト>
	<abc>abcdefghijklmn</abc>
	<テスト1>てすてす</テスト1>
	<テスト2>
		<テスト21>ふが</テスト21>
		<テスト22>ほげ</テスト22>
	</テスト2>
	<テスト2>
		<テスト21>ふが</テスト21>
		<テスト22>ほげ</テスト22>
	</テスト2>
	<テスト3>123456789</テスト3>
</テスト>';

$sx = simplexml_load_string($xml);
$json = json_encode($sx);
$a = json_decode($json, true);

var_dump($a);

結果

array(4) {
  ["abc"]=>
  string(14) "abcdefghijklmn"
  ["テスト1"]=>
  string(12) "てすてす"
  ["テスト2"]=>
  array(2) {
    [0]=>
    array(2) {
      ["テスト21"]=>
      string(6) "ふが"
      ["テスト22"]=>
      string(6) "ほげ"
    }
    [1]=>
    array(2) {
      ["テスト21"]=>
      string(6) "ふが"
      ["テスト22"]=>
      string(6) "ほげ"
    }
  }
  ["テスト3"]=>
  string(9) "123456789"
}

別解

なお、array にキャストすると、2階層目以降がSimpleXMLElementオブジェクトのままになるので、1階層だけのものすごく単純なXMLなら配列へのキャストを使うのもあり。

var_dump((array)simplexml_load_string($xml));

結果

array(4) {
  ["abc"]=>
  string(14) "abcdefghijklmn"
  ["テスト1"]=>
  string(12) "てすてす"
  ["テスト2"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#5 (2) {
      ["テスト21"]=>
      string(6) "ふが"
      ["テスト22"]=>
      string(6) "ほげ"
    }
    [1]=>
    object(SimpleXMLElement)#6 (2) {
      ["テスト21"]=>
      string(6) "ふが"
      ["テスト22"]=>
      string(6) "ほげ"
    }
  }
  ["テスト3"]=>
  string(9) "123456789"
}

関連するメモ

コメント