XMLファイルをPHPで扱いやすい変数にする

2014-03-07

XMLファイルをPHPで開いたけど、どうやって配列に格納すればいい?

XML形式のファイルからデータを取り出してPHPで扱いたいときに、file_get_contentsしてもその後どうすれば・・・といったケースです。

サンプル

PHPには simplexml_load_string という便利な関数が有ります。この関数はXMLファイルをオブジェクトとして返してくれるので、それを変数に格納していきます。

   $string = file_get_contents('xml.xml');   //ファイルを得る
   $obj    = simplexml_load_string($string); //オブジェクトに変換

実行結果

object(SimpleXMLElement)#1 (8) {
  ["userFname"]=>
  string(6) "太朗"
  ["userLname"]=>
  string(6) "山田"
.......

このままでも良いのですが、扱い易い変数にするため、以下のようなユーザー定義関数を通します。

function xml_row($obj) {
   $arr = array();
   if (is_object($obj)) {
      $obj = get_object_vars($obj);
   } else {
      $obj = $obj;
   }
   foreach ($obj as $key => $val) {
      if (is_object($obj[$key])) {
         $arr[$key] = xml_row($val);
      } else if (is_array($val)) {
         foreach($val as $k => $v) {
            if (is_object($v) || is_array($v)) {
               $arr[$key][$k] = xml_row($v);
            } else {
               $arr[$key][$k] = $v;
            }
         }
      } else {
         $arr[$key] = $val;
      }
   }
           return $arr;
}

全体のソースコード

function xml_row($obj) {
   $arr = array();
   if (is_object($obj)) {
      $obj = get_object_vars($obj);
   } else {
      $obj = $obj;
   }
   foreach ($obj as $key => $val) {
      if (is_object($obj[$key])) {
         $arr[$key] = xml_row($val);
      } else if (is_array($val)) {
         foreach($val as $k => $v) {
            if (is_object($v) || is_array($v)) {
               $arr[$key][$k] = xml_row($v);
            } else {
               $arr[$key][$k] = $v;
            }
         }
      } else {
         $arr[$key] = $val;
      }
   }
           return $arr;
}

   $string = file_get_contents('xml.xml');   //ファイルを得る
   $obj    = simplexml_load_string($string); //オブジェクトに変換
   $obj    = xml_row($obj); //配列にする

   var_dump($obj);
?>

実行結果はサンプルを参照して下さい。 このように配列で戻ってくるので、後はご自由に。

名前空間が定義されている場合

   $string = preg_replace('/:/','_',file_get_contents('xml2.xml'));
   $obj    = simplexml_load_string($string);
   $obj    = xml_row($obj);

要は邪魔な文字を先にアンダーバーなどに変換してしまえばいいのです。