データがどのように返されるか

データがどのように返されるか --  ファイルからのデータの取得

説明

Contact_Vcard_Parse は、 ファイルあるいはテキストブロックから vCard データを読み込み、 それを入れ子状の配列に変換します。以前は配列の内容を事細かに説明していたのですが、 それよりは配列の概要をお見せしたほうがわかりやすいですよね。

$parse_result = array (
    [int_cardnumber] => array (
        [string_datatype] => array (
            ["param"] => array (
                [string_paramname] => array (
                    [int_repetitionnumber] => string_paramtext
                )
            )
            ["value"] => array (
                [int_partnumber] => array (
                    [int_repetitionnumber] => string_valuetext
                )
            )
        )
    )
)

例として、私の友人である Bolivar Shagnasty の vCard を見てみましょう。

BEGIN:VCARD
VERSION:3.0
N:Shagnasty;Bolivar;Odysseus;Mr.;III,B.S.
FN:Bolivar Shagnasty
ADR;TYPE=HOME,WORK:;;123 Main,Apartment 101;Beverly Hills;CA;90210
EMAIL;TYPE=HOME;TYPE=WORK:boshag@example.com
EMAIL;TYPE=PREF:boshag@ciaweb.net
END:VCARD

これは非常にシンプルな vCard です。友人である Bolivar の名前、ひとつの住所 (Bolivar は在宅勤務のようです)、 ふたつの email アドレス (ひとつは仕事用と家庭用の共用、そしてもうひとつは "お気に入りの" アドレス) が含まれます。このシンプルな vCard をパースした結果は、このようになります。

(
    [0] => Array
        (
            [VERSION] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => 3.0
                                        )

                                )

                        )

                )

            [N] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array // family
                                        (
                                            [0] => Shagnasty
                                        )

                                    [1] => Array // first
                                        (
                                            [0] => Bolivar
                                        )

                                    [2] => Array // additional or middle
                                        (
                                            [0] => Odysseus
                                        )

                                    [3] => Array // honorifix prefix
                                        (
                                            [0] => Mr.
                                        )

                                    [4] => Array // honorifix suffix
                                        (
                                            [0] => III
                                            [1] => B.S.
                                        )

                                )

                        )

                )

            [FN] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Bolivar Shagnasty
                                        )

                                )

                        )

                )

            [ADR] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => HOME
                                            [1] => WORK
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array // p.o. box
                                        (
                                            [0] => 
                                        )

                                    [1] => Array // extended
                                        (
                                            [0] => 
                                        )

                                    [2] => Array // street
                                        (
                                            [0] => 123 Main
                                            [1] => Apartment 101
                                        )

                                    [3] => Array // locality or city
                                        (
                                            [0] => Beverly Hills
                                        )

                                    [4] => Array // region, state, or province
                                        (
                                            [0] => CA
                                        )

                                    [5] => Array // postal code
                                        (
                                            [0] => 90210
                                        )

                                    [6] => Array // country
                                        (
                                            [0] => 
                                        )

                                )

                        )

                )

            [EMAIL] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => HOME
                                            [1] => WORK
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => boshag@example.com
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => PREF
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => boshag@ciaweb.net
                                        )

                                )

                        )

                )

        )

)

なんてこった! めちゃくちゃで見苦しい限りです。 でも、この中には vCard の情報がすべて含まれており、 好きなように料理することができます。 すべての要素やコンポーネントが (個別に) 分かれており、 vCard の構造も知ることができます。

ええ、知っていますとも。ちょっとこの配列は階層が深すぎるし、 見栄えもよくないし、非効率的だっていうことを。 vCard フォーマットの問題 (あるいは性質?) は、 vCard の要素がそれぞれ複数の値をとりうるということです。 これにより vCard フォーマットは非常に柔軟なものになっていますが、 きれいにパースして解釈することが少々難しくなります。 私が考える範囲でもっとも簡単な方法は、入れ子状の配列を使用することでした。 オブジェクト指向のアプローチのほうがよりよいのでしょうが、 だとしても結局は入れ子状のオブジェクトや配列を vCard オブジェクト内に保持しないと vCard データ要素の複数の値を表せません。