XML_Unserializerで配列の要素数が一つだと階層が崩れる問題

XMLの解析に便利なXML_Unserializer

<?
$UNSERIALIZER = new XML_Unserializer($XMLOPTIONS);
$UNSERIALIZER->unserialize($response_body);
$result = $UNSERIALIZER->getUnserializedData();

みたいに使います。

ところが一つ問題があって、

Array
(
    [item] => Array
        (
            [0] => Array
                (
                    [id] => 1001
                    [datetime] => 2012-02-08 19:13:51
                )
            [1] => Array
                (
                    [id] => 1020
                    [datetime] => 2012-02-08 22:52:49
                )

        )
)

のような[item]内に複数要素をもつ場合はそのまま取得できるけれど、

Array
(
    [item] => Array
        (
            [0] => Array
                (
                    [id] => 1001
                    [datetime] => 2012-02-08 19:13:51
                )
        )
)

のように、要素が一つだけの場合、getUnserializedData()して出力したら

print_r($data['item']);

  ↓

Array
(
    [id] => 1001
    [datetime] => 2012-02-08 19:13:51
 )

と配列の階層を一つ無くしてしまう。。。



これの対策として

<?
if(isset($data['item'][0])){

みたいな処理を入れるしかないのかを調査しました。



結論

$XML_OPTIONS

  'forceEnum'       => array('item')

を追加してあげればOKです。

Pearのマニュアルに書いてありますが、いまいち意味が不明
もう少しググる


要素の数によって配列の階層が変わってしまいます。これが以前から悩みの種で、 if (isset($item[0])) 〜 とかで処理の振り分けをしてはモヤモヤした気持ちを抱えていました。
おぉまったく同じプロセス!AZS!!


※補足

オプションの種類


XML_SERIALIZER_OPTION_INDENT

  • > インデントに使用する文字

XML_SERIALIZER_OPTION_LINEBREAKS

  • > 改行に使用する文字

XML_SERIALIZER_OPTION_TYPEHINTS

  • > 各要素の型をXMLに付与するかどうか(true,false)

XML_SERIALIZER_OPTION_XML_DECL_ENABLED

  • > XML宣言を入れるか入れないか(true,false)

XML_SERIALIZER_OPTION_XML_ENCODING

XML_SERIALIZER_OPTION_DEFAULT_TAG

  • > 不正なタグ名や、配列が渡されたときのデフォルトのタグ名

XML_SERIALIZER_OPTION_CLASSNAME_AS_TAGNAME

  • > オブジェクトをSerializeするとき、オブジェクト名をタグ名にするかどうか(true,false)

XML_SERIALIZER_OPTION_MODE

  • > Serializerの振る舞いの指定(XML_SERIALIZER_MODE_SIMPLEXMLを指定すると配列の部分は親要素のキーをタグ名に使用する)

XML_SERIALIZER_OPTION_ROOT_NAME

  • > トップレベルのタグ名を指定する

XML_SERIALIZER_OPTION_ROOT_ATTRIBS

  • > トップレベルタグの属性を指定する(配列)

XML_SERIALIZER_OPTION_ATTRIBUTES_KEY

  • > 属性名を指定する(配列)

XML_SERIALIZER_OPTION_CONTENT_KEY

  • > 要素名を指定する(配列)

XML_SERIALIZER_OPTION_COMMENT_KEY

  • > コメント名を指定する(配列)

XML_SERIALIZER_OPTION_NAMESPACE

XML_SERIALIZER_OPTION_ENTITIES

  • > エンティティを変換するかどうか(true,false)

XML_SERIALIZER_OPTION_RETURN_RESULT

  • > Serializeに成功したかどうかの戻り値を返すかどうか(true,false)

XML_SERIALIZER_OPTION_IGNORE_NULL

  • > NULL値の要素を無視するかどうか(true,false)