PHPの連想配列から一部を切り出す話

なんかこういう感じの連想配列から

<?php
$array = [
  "id" => 1,
  "name" => "NAME",
  "hoge" => "HOGEHOGE",
  "piyo" => "PIYOPIYO",
  "huga" => "HUGAHUGA",
  ...
];

任意のキーを指定して新しい連想配列に切り出したい

<?php
// このキーの配列を元に
$keys = ['id', 'name'];

// こんな感じの新しい連想配列がほしい
[
  "id" => 1,
  "name" => "NAME",
]

ありがち実装

<?php
$out = [];
foreach($keys as $key) {
  $out[$key] = $array[$key];
}
return $out;

かっこいい実装

<?php
return array_intersect_key($array, array_flip($keys));

PHP: array_intersect_key - Manual

PHP: array_flip - Manual


では逆に指定したキー以外の配列を切り出すにはどうすれば良いか?

=> array_diff_keys()を使ってください。

<?php
return array_diff_key($hash, array_flip($keys));

例えば、キーにidという文字列が含まれるものだけ抜き出したい、などの複雑な条件ではどうするか?

=> array_filter()を使ってください。
ARRAY_FILTER_USE_KEYを第三引数に渡すとコールバックに連想配列のキーが渡ります。

<?php
return array_filter($array, function($key) { 
  return strpos($key, 'id') !== false;
}, ARRAY_FILTER_USE_KEY);

用法
O/Rマッパーからブリブリと取得したN次元配列を程よいサイズのJSONに変換する時などに、foreachを死ぬほど入れ子にする代わりに使えるかもしれません。