SimpleXMLで取得したオブジェクトを属性も含めて配列に変換
php5のSimpleXMLエクステンションにてオブジェクトから配列に変換する際、属性値(アトリビュート)も一緒に配列化するのにハマったためメモ
テストで使用したXML
簡単に以下のXMLを定義して、SimpleXMLで読み込みさせてテスト。
<?xml version='1.0'?> <template> <summary> <title>タイトル</title> <image width="100" height="260">イメージ</image> <description>説明</description> </summary> </template>
SimpleXMLでのデータ取得の仕方
参考までにSimpleXMLでのデータの取得の仕方を記述。root要素(例ではtemplateタグ)以下の要素がオブジェクトとして保存されます。
$xml = simplexml_load_string($xmlContent); //imageタグの中身を取得 echo 'image要素の中身:'; echo $xml->summary->image; echo '<br />'; //imageのwidth属性を取得 echo 'image要素のwidth属性値:'; echo $xml->summary->image['width']; echo '<br />';
属性値は配列として取り出します。出力結果は以下。
image要素の中身:イメージ image要素のwidth属性値:100
SimpleXMLでXMLを読み込んだ場合のデータ構造
例のXMLをvar_dump関数で出力した場合の結果です。
object(SimpleXMLElement)#2 (1) {
["summary"]=>
object(SimpleXMLElement)#1 (3) {
["title"]=>
string(12) "タイトル"
["image"]=>
string(12) "イメージ"
["description"]=>
string(6) "説明"
}
}
SimpleXMLElementを入れ子構造の配列に変換する関数
image要素の属性値は$arr['image_attrs']['width']のように要素名_attrsで取り出すようになっています。
$result = array();
$result = xml2arr(simplexml_load_string($xmlContent));
var_dump($result);
function xml2arr($xmlobj) {
$arr = array();
if (is_object($xmlobj)) {
$xmlobj = get_object_vars($xmlobj);
} else {
$xmlobj = $xmlobj;
}
foreach ($xmlobj as $key => $val) {
if (is_object($xmlobj[$key])) {
$arr[$key] = xml2arr($val);
} else if (is_array($val)) {
foreach($val as $k => $v) {
if (is_object($v) || is_array($v)) {
$arr[$key][$k] = xml2arr($v);
} else {
$arr[$key][$k] = $v;
}
}
} else {
$arr[$key] = $val;
}
}
return $arr;
}
var_dumpで出力した結果
Array
(
[summary] => Array
(
[title] => タイトル
[image] => イメージ
[description] => 説明
)
)
最後に
うぉっ、すごく久しぶりにブログを更新しました。。。お客様にはまじめに更新してくださいと依頼しているのになぁ。。。しかも、題材もニッチで自分のお客様になる人対象じゃないという。。。(汗
やはり、自分の好き勝手に更新するのが一番ですよね?(おぃ
それでもネタは溜まっているのにこれは無いだろうと思わなくも無い(汗
前後の記事
あわせて読む
コメント投稿