共通項の多い別々のものをまとめて表示したい時があります。こういった時は共通部分と差分を振り分けて、それを操作すると楽です。これを PHP でやるテンプレートは次です
<?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 は渡された配列すべてに共通するキーのみを持つ配列を返します
// この配列中の各要素の値は第一引数中の値です。
// @see https://www.php.net/manual/ja/function.array-intersect-key.php
if('共通項にはインポート側の値を入れるならば'){
$common = array_intersect_key($import, $export);// 共通項の内インポート側だけを残す
} else {
// 共通項にはエクスポート側の値を入れるならば
$common = array_intersect_key($export, $import);// 共通項の内エクスポート側だけを残す
}
// array_diff_key は渡された配列らの中で一つ目の配列にのみ存在するキーのみを持つ配列を返します
// この配列中の各要素の値は第一引数中の値です
// @see https://www.php.net/manual/ja/function.array-diff-key.php
$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"
}
*/
こんな感じで振り分けると後の処理がやりやすくなります。この方法で特に大事なのは具体的なキーの名前を参照していない点にあります。これを用いることでいちいち二つ以上の配列やらデータベース中のテーブルやらの各キーを比較することなく振り分けができ、その後のデータ構造の変更にも強くなります。