LoginSignup
33
36

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-12
$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)

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

最後に一言

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

33
36
3

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
33
36