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:[email protected]
EMAIL;TYPE=PREF:[email protected]
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] => [email protected]
)
)
)
[1] => Array
(
[param] => Array
(
[TYPE] => Array
(
[0] => PREF
)
)
[value] => Array
(
[0] => Array
(
[0] => [email protected]
)
)
)
)
)
)
なんてこった! めちゃくちゃで見苦しい限りです。 でも、この中には vCard の情報がすべて含まれており、 好きなように料理することができます。 すべての要素やコンポーネントが (個別に) 分かれており、 vCard の構造も知ることができます。
ええ、知っていますとも。ちょっとこの配列は階層が深すぎるし、 見栄えもよくないし、非効率的だっていうことを。 vCard フォーマットの問題 (あるいは性質?) は、 vCard の要素がそれぞれ複数の値をとりうるということです。 これにより vCard フォーマットは非常に柔軟なものになっていますが、 きれいにパースして解釈することが少々難しくなります。 私が考える範囲でもっとも簡単な方法は、入れ子状の配列を使用することでした。 オブジェクト指向のアプローチのほうがよりよいのでしょうが、 だとしても結局は入れ子状のオブジェクトや配列を vCard オブジェクト内に保持しないと vCard データ要素の複数の値を表せません。