たとえばいろんな本があって、それぞれの本にジャンルや特長などのタグがついています。共通するタグを手に入れるには、どのようにプログラムすればよいでしょうか?
本は配列のキーになっていて、タグは値です。本にタグはたくさん付けられますので、値といっても配列となっています。このようなデータを想定しましょう。
- 本A – タグ1、タグ2、タグ3
- 本B – タグ1、タグ3、タグ4
- 本C – タグ2、タグ3、タグ4
この場合、タグ3が全ての本につけられています。タグ1、タグ2、タグ4は惜しいことに3冊のうち2冊にしかタグ付けされていないので、該当しません。
人間の目で見れば、この程度すぐに抽出できますわね♪では、プログラムで自動的には?。。。難しいです><。でもできましたので、ノートいたします♪
使う関数!
- reset — 配列の内部ポインタを先頭の要素にセットする
- array_intersect — 配列の共通項を計算する
値を調べるもととなる配列のキーは保持される点が、興味深いと思いました。
考え方のポイント
- 共通するデータで基準の変数を上書き
2次元目の配列をどれか適当に選択しまして、これを基準の変数としております。これとその他の2次元目の配列を比較しまして、共通項を取得します。
そして次の2次元目の配列と比較しまして、、、と繰り返していくことで全ての2次元目の配列に共通する値を抽出することができます♪
PHP ソースの最重要ポイント♪
2次元目の配列を次々とループしていく中で基準の変数と比較する部分です。
// 配列の最初の value を基準に全ての value と比較して共通するデータを抽出 foreach ($arr_before as $before) { // 共通するデータで基準の変数を上書き $arr_intersect = array_intersect($arr_intersect, $before); }
サンプルソース
これをそのままファイルに貼り付けて、ウェブブラウザからアクセスすれば結果がわかります♪
<?php $arr_before = array( 1 => array( 10 => 1, 11 => 4 ), 3 => array( 0 => 1, 1 => 2, 2 => 4 ), 7 => array( 20 => 1, 21 => 2, 22 => 3 ) ); echo '★★★ START 2次元配列において、2次元目の配列に共通する value を取得する ★★★'; var_dump($arr_before); // 配列の最初の value を取得し、共通するデータを抽出する基準の変数を生成 $arr_intersect = reset($arr_before); // 配列の最初の value を基準に全ての value と比較して共通するデータを抽出 foreach ($arr_before as $before) { // 共通するデータで基準の変数を上書き $arr_intersect = array_intersect($arr_intersect, $before); } echo '★★★ RESULT ★★★'; /* * reset 関数で取得した要素(配列)が基準となる。 * この基準の配列のキーは保持される。 */ var_dump($arr_intersect); ?>
おわりに
本投稿でやりたいことを実現するのに、実は2〜3時間ほどかかりました><。PHP の配列とはどのようなものであるのか、使いこなせていないことを思い知りました。
そんなとき、本家ドキュメントが非常に参考になりました。「はじめての PHP」的なサイトなどよりもよっぽど信頼できますし、とてもよく理解できました。
このような処理は、PHP でなくともさまざまなプログラム言語で行いたい時があると思います。
今回の投稿は、特に考え方さえわかればさまざまな言語に応用できると思いますのですこし助長となりましたけれども、繰り返し同じことを述べました。
このようなデータの処理方法、今後もたくさん出てくるかと思いますのでそのときは逃さずノートしたく存じます。
以上です。