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

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

説明

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 データ要素の複数の値を表せません。

vCard 2.1 や 3.0 のテキストブロックの作成および取得 (Previous) 遭遇するであろう問題 (Next)
Last updated: Sat, 25 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: dco@maeglin.com
It seems that you forgot a depth level in the formal representation. Each datatype may contain several data (for instance, EMAIL may contain more than one email).
it should be :
$parse_result = array (
[int_cardnumber] => array (
[string_datatype] => array (
[int_datanumber] => array (
["param"] => array (
[string_paramname] => array (
[int_repetitionnumber] => string_paramtext
)
)
["value"] => array (
[int_partnumber] => array (
[int_repetitionnumber] => string_valuetext
)
)
)
)
)
)