PHPのarray_filterとin_arrayを使って、特定のキーを持つ要素のみを抽出して新しい配列を作る


やりたい事

ある配列の中から、特定のキーを持つ要素(複数)のみ抽出して新しい配列として取得したい。
array_column()でやろうとしたが、単一のカラムの値しか取得できなかったので、array_filterの中でin_arrayを使って特定のキーを持っているか判定するようにした。

コード

$baseArrayの中で$needleArrayのキーを持つ要素のみで構成される配列を作る。

$baseArray = [
'ゴミ処理' => 1500,
'コタツ(布団付き)' => 3000,
'電気グリル鍋' => 2000,
'大きな鍋' => 1000,
'カセットコンロ' => 1500,
'たこ焼き器' => 1500,
'大人数レイアウト' => 4000,
'寿司桶' => 500,
'プロジェクター' => 1500,
'深夜利用' => 5000,
'宿泊(1〜3名様)' => 6000,
'宿泊(4〜5名様)' => 8000,
'コテ' => 1000,
'撮影用ミニライト' => 1000,
'姿見鏡' => 1000,
'サプライズ装飾' => 4000,
'炊飯器' => 1500,
'トースター' => 1500,
'ミキサー' => 1000,
'付けない' => 0,
];

$needleArray = ['ゴミ処理','宿泊(1〜3名様)','電気グリル鍋'];

//ここから処理
$newArray = array_filter($baseArray,function($k) use ($needleArray) {
                return in_array($k,$needleArray,true);
            },ARRAY_FILTER_USE_KEY);

//追記 指摘がありました。こっちの方がスッキリしてる!
$newArray = array_intersect_key($baseArray, array_flip($needleArray));


説明

array_filter

・第1引数・・フィルタリングの対象になる配列
・第2引数
 ・・フィルタリング処理。第3引数にARRAY_FILTER_USE_KEYを設定することで、クロージャの中で$baseArrayのキーを使えるようになります。キーはクロージャの引数に$kで渡す。この処理でtrueの場合、該当する要素が結果の配列に格納される。
・第3引数・・オプション

フィルタリング処理内容

第2引数の処理の中では、in_arrayによって、$needleArrayの中に$kが存在するかをチェックしている。存在する場合のみ該当要素が結果の配列に格納される。

以上。

参考
array_filter()
http://php.net/manual/ja/function.array-filter.php
in_array()
http://php.net/manual/ja/function.in-array.php