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