DBから取った配列をPHPで1行変換


PHPでデータベースから配列を取ってくると、使いづらい形になっていることがよくあります。ものによっては、1行で思い通りの変換ができるので、使いこなせると快感です。

その1…ただの配列でいいのに

DBから1列だけ取ってくると、こんな配列になっていることがよくあります。

配列1
$arr1 = [
  ['column' => 'foo'],
  ['column' => 'bar'],
  ['column' => 'baz']
];

このまま使うには明らかに不便ですし、「ただの配列にしたい」ということはよくあるかと思います。普通に書けばforeachで回してどうのこうのとなるかと思いますが、実は1行で片付きます。

シンプルに変換
$simple_arr1 = array_map('reset', $arr1);

array_mapは、配列の各要素に同じ関数を適用する関数なのですが、指定しているresetはあまり見慣れないかもしれません。説明を読んでもわかりにくいかもしれませんが、返り値としては「配列の先頭の値」を返す関数なので、mapした結果は「先頭要素だけ抜き出した配列」になって、['foo', 'bar', 'baz']という、単なる配列ができ上がります。

その2…ただの配列には興味ありません

逆に、複数項目をDBから取ってきても、返り値はたいてい単なる配列となっています。

配列2
$arr2 = [
  ['id' => '1', 'family' => 'Suzumiya', 'name' => 'Haruhi'],
  ['id' => '2', 'family' => 'Nagato',   'name' => 'Yuki'],
  ['id' => '3', 'family' => 'Asahina',  'name' => 'Mikuru'],
  ['id' => '4', 'family' => 'Koizumi',  'name' => 'Itsuki'],
];

特に、キーが1から連続するようなマスターをこのような形で取ってくると、「1個ずれたまま参照してしまって、最後のをアクセスしようとしない限り気づかない」というような、複雑なバグすら起こしかねませんので、使いやすいようにidをキーにした連想配列にしておきたいものです。

PHP 5.5からは、このような場合に便利なarray_column関数が登場しています。

連想配列に変換
$assoc_arr2 = array_column($arr2, NULL, 'id');

なお、その1のほうもarray_columnで、$simple_arr1 = array_map($arr1, 'column');のように書けます。