LoginSignup
15
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-23

やりたい事

ある配列の中から、特定のキーを持つ要素(複数)のみ抽出して新しい配列として取得したい。
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

15
16
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16