PHP

fetchAllで返ってくる配列のかたちのあれこれ

More than 3 years have passed since last update.

$query  = $this->db->query($sql, $params);

$result = $query->fetchAll();

このfetchAll()の中身によって配列の形が異なる。


なにもなし または PDO::FETCH_ASSOC

array

0 =>
array
'code' => string '1' (length=1)
'number' => string '2' (length=1)
'number_2' => string '' (length=0)
1 =>
array
'code' => string '123A-R' (length=6)
'number' => string '3' (length=1)
'number_2' => string '' (length=0)
2 =>
array
'code' => string '99999' (length=5)
'number' => string '4' (length=1)
'number_2' => string '1' (length=1)

これを最初のカラム(code)の値でくくってあげたかったけど迷子になってしまったので議事録。

-


PDO::FETCH_COLUMN|PDO::FETCH_GROUP

array

1 =>
array
0 =>
array
'number' => string '2' (length=1)
'123A-R' =>
array
0 =>
array
'number' => string '3' (length=1)
99999 =>
array
0 =>
array
'number' => string '4' (length=1)

これでいけると思ってたのに、なぜか2つめのカラムの情報が落ちちゃった。。なぜ???

空かどうかとか関係あるのかな????


PDO::FETCH_COLUMN

array

0 => string '1' (length=1)
1 => string '123A-R' (length=6)
2 => string '99999' (length=5)


PDO::FETCH_GROUP

array

1 =>
array
0 =>
array
'number' => string '2' (length=1)
'number_2' => string '' (length=0)
'123A-R' =>
array
0 =>
array
'number' => string '3' (length=1)
'number_2' => string '' (length=0)
99999 =>
array
0 =>
array
'number' => string '4' (length=1)
'number_2' => string '' (length=0)

やりたかったのはこれ。

(ほんとは、2階層目の0も要らないから省きたいんだけど)

http://php.net/manual/ja/pdostatement.fetchall.php

PHPのマニュアル読んだけどよくわからなかった・・・ちゃんと調べなきゃー


追記

コメントいただいている内容です。


(ほんとは、2階層目の0も要らないから省きたいんだけど)


上記への対応方法

$result = array_map('current', $query->fetchAll(PDO::FETCH_GROUP));

結果

array

1 =>
array
'number' => string '2' (length=1)
'number_2' => string '' (length=0)
'123A-R' =>
array
'number' => string '3' (length=1)
'number_2' => string '' (length=0)
99999 =>
array
'number' => string '4' (length=1)
'number_2' => string '' (length=0)

やりたいことができました!ありがとうございます!!


最後に一言

後から自分の記事を見直すと例に使っているコードもデータも結果の書き方もすごくわかりにくいですね。次に活かします。