10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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');のように書けます。

10
10
0

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
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?