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