配列値×配列値で検索
サンプル
// 検索対象配列
$baseArr = [1,2,3,4,5];
// 検索情報配列
$searchArr = [2,3,9];
// 一致した検索対象配列の要素が格納される
$result = array_filter($baseArr, function($value) use ($searchArr) {
return in_array($value, $searchArr);
}
);
var_dump($result);
/* 結果
array(2) {
[1]=> int(2)
[2]=> int(3)
}
*/
サンプルでは検索対象配列に1から5までのデータ、検索情報配列には2,3,9が格納されています。
このうち1から5までの値で一致した、2,3の要素が返却されました。
array_filter関数の第一引数に検索対象配列を指定し、第二引数にはフィルターの条件(無名関数)を設定し、useには検索情報配列を引き継いでいます。
フィルター条件にはin_array関数を使うことで、検索対象配列の各値が検索情報配列の値に含まれている場合にはリターン値がtrueとなり、フィルタリング後の結果セットに検索対象配列の該当要素が格納されていくようになっています。
連想配列キー×配列値で検索
サンプル
// 検索対象連想配列
$baseArr = [
100 => 'りんご',
200 => 'みかん',
300 => 'メロン',
400 => 'レモン',
500 => 'バナナ'
];
// 検索情報配列
$searchArr = [100,300,999];
// 一致した検索対象連想配列の要素が格納される
$result = array_filter($baseArr, function($key) use ($searchArr) {
return in_array($key, $searchArr);
}, ARRAY_FILTER_USE_KEY
);
var_dump($result);
/* 結果
array(2) {
[100]=> string(9) "りんご"
[300]=> string(9) "メロン"
}
*/
先の例では、配列同士の値を検索するものでしたが、こちらでは連想配列のキー基準で検索をしています。
array_filter関数の第三引数のflagに「ARRAY_FILTER_USE_KEY」を指定することで、第二引数に指定したフィルターの条件(無名関数)には検索対象連想配列のキーが渡されます。
フィルターの条件で検索対象連想配列の各キーが検索情報配列の値に含まれている場合には、検索対象連想配列の該当要素が格納されます。
きっかけ
上記の連想配列キー×配列値で一致した要素を取得する必要が生じ、in_array関数単体だと一つの値が配列に含まれるかどうかはできても、この場合に良い方法がないものかと考えました。
当初はforeach文を使っての以下のような手段を検討しましたが、
$result = [];
foreach ($baseArr as $key => $value) {
if (in_array($key, $searchArr)) {
$result[$key] = $value;
}
}
もう少しスマートなやり方はないだろうか…ということで備忘録としてまとめてみました。
参考