共通項の多い別々のものをまとめて表示したい時があります。こういった時は共通部分と差分を振り分けて、それを操作すると楽です。これを PHP でやるテンプレートは次です
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?php $import = [ 'import_id' => 3, 'user_id' => 1, 'comment' => 'インポートのコメント' , 'import_spec' => 'test_import' , ]; $export = [ 'export_id' => 12, 'userId' => 1, 'comment' => 'エクスポートのコメント' , 'export_spec' => 'test_export' , ]; // array_intersect_key は渡された配列すべてに共通するキーのみを持つ配列を返します // この配列中の各要素の値は第一引数中の値です。 if ( '共通項にはインポート側の値を入れるならば' ){ $common = array_intersect_key ( $import , $export ); // 共通項の内インポート側だけを残す } else { // 共通項にはエクスポート側の値を入れるならば $common = array_intersect_key ( $export , $import ); // 共通項の内エクスポート側だけを残す } // array_diff_key は渡された配列らの中で一つ目の配列にのみ存在するキーのみを持つ配列を返します // この配列中の各要素の値は第一引数中の値です $importOnlyItems = array_diff_key ( $import , $common ); // インポート側から共通項を除去 $exportOnlyItems = array_diff_key ( $export , $common ); // エクスポート側から共通項を除去 var_dump( $common , $importOnlyItems , $exportOnlyItems ); /* array(1) { ["comment"]=> string(30) "インポートのコメント" } array(3) { ["import_id"]=> int(3) ["user_id"]=> int(1) ["import_spec"]=> string(11) "test_import" } array(3) { ["export_id"]=> int(12) ["userId"]=> int(1) ["export_spec"]=> string(11) "test_export" } */ |
こんな感じで振り分けると後の処理がやりやすくなります。この方法で特に大事なのは具体的なキーの名前を参照していない点にあります。これを用いることでいちいち二つ以上の配列やらデータベース中のテーブルやらの各キーを比較することなく振り分けができ、その後のデータ構造の変更にも強くなります。