【PHP】PDOのfetchで取得できる配列パターン一覧

2019年7月29日

PHPからMySQLのデータベースに接続するオブジェクトPDOでSELECTする際に、fetchやfetchAllメソッドで結果の配列を取得できます。

参考 PDOでSELECTの使い方【PHP】

その際に、fetchまたはfetchAllで引数を指定することで、様々なパターンの配列を返り値として受け取ることが出来ます。

今回はPDOのfetchやfetchAllで取得できる配列のパターンをまとめました。

ソースコードのデモでは、下記のテーブルを使用します。

table名:doraemon_users
id name gender type
1 のび太 man human
2 ドラえもん man robot
3 ジャイアン man human
4 スネ夫 man human
5 しずか woman human
6 ドラミ woman robot

キーを連番に、値をカラム毎の配列で取得する

純粋に結果を取得し、それが複数存在する場合に使う最もオーソドックスな取得例です。

サンプルコード
$sql = "SELECT * FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_ASSOC);
print_r($aryList);
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => のび太
            [gender] => man
            [type] => human
        )

    [1] => Array
        (
            [id] => 2
            [name] => ドラえもん
            [gender] => man
            [type] => robot
        )

    [2] => Array
        (
            [id] => 3
            [name] => ジャイアン
            [gender] => man
            [type] => human
        )

    [3] => Array
        (
            [id] => 4
            [name] => スネ夫
            [gender] => man
            [type] => human
        )

    [4] => Array
        (
            [id] => 5
            [name] => しずか
            [gender] => woman
            [type] => human
        )

    [5] => Array
        (
            [id] => 6
            [name] => ドラミ
            [gender] => woman
            [type] => robot
        )

)

【単一行取得の場合】キーをカラム毎に、値をそれぞれのカラムに充てた配列で取得する

主に取得件数が1行の場合はfetchを使用したほうが扱いやすいです。

サンプルコード
$sql = "SELECT * FROM doraemon_users WHERE id = 2";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetch(PDO::FETCH_ASSOC);
print_r($aryList);
Array
(
    [id] => 2
    [name] => ドラえもん
    [gender] => man
    [type] => robot
)

取得件数が複数存在した場合は、最初の一行の結果を取得します。

キーを連番に、値をある1つのカラムを指定した一次元配列として取得する

特定のカラムに指定した一次元配列として取得したい場合は、FETCH_COLUMNが便利です。

サンプルコード
$sql = "SELECT name FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_COLUMN);
print_r($aryList);
Array
(
    [0] => のび太
    [1] => ドラえもん
    [2] => ジャイアン
    [3] => スネ夫
    [4] => しずか
    [5] => ドラミ
)

SELECT~で取得したいカラムを指定してください。

複数存在した場合は、一番最初に定義した先頭カラムが充てられます。(つまり*の場合はidになります)

カラム(列)とレコード(行)を指定して、配列ではなく変数として取得する

欲しいデータを取得する際、特定のカラム(列)とレコード(行)を指定する場合は、取得するデータが配列である必要はありません。

その場合は単一の変数としても取得できます。

サンプルコード
$sql = "SELECT name FROM doraemon_users WHERE id = 4";
$sth = $pdo -> query($sql);
$name = $sth -> fetch(PDO::FETCH_COLUMN);
echo $name;
スネ夫

先ほどと同じように、SELECT~で取得したいカラムを指定してください。

SELECTで最初に定義した先頭カラムが返され、結果が複数行となった場合は最初の行が結果が返されます。

例えば、結果レコードの件数のみを取得したい場合は、配列である必要がないので、この形式が取得しやすいです。

サンプルコード
$sql = "SELECT COUNT(*) FROM doraemon_users";
$sth = $pdo -> query($sql);
$count = $sth -> fetch(PDO::FETCH_COLUMN);
echo '件数は'.$count.'件です';
件数は6件です

また、件数の取得はPDOオブジェクトのrowCount()でも取得できます。

【PHP】PDOで件数を取得するrowCountの使い方

キーと値を指定したカラムで取得する

配列のキーを連番ではなく指定したカラムに変更することが出来ます。

サンプルコード
$sql = "SELECT id, name FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_KEY_PAIR);
print_r($aryList);
Array
(
    [1] => のび太
    [2] => ドラえもん
    [3] => ジャイアン
    [4] => スネ夫
    [5] => しずか
    [6] => ドラミ
)

idなどをユニークな値をキーに設定することで、いろいろと処理に融通が利くことが多いです。

FETCH_KEY_PAIRを使用する際は、SELECTで指定するカラムを必ず2つにして、それぞれキー,値となるようにしておかないと、下記のようなエラーを吐くのでご注意を。

General error: PDO::FETCH_KEY_PAIR fetch mode requires the result set to contain extactly 2 columns.

キーを指定したカラムに、値をカラム毎の配列で取得する

先頭のカラムをキーに、以降を各カラム毎の配列で取得したい場合の処理です。

サンプルコード
$sql = "SELECT id, doraemon_users.* FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);
print_r($aryList);
Array
(
    [1] => Array
        (
            [id] => 1
            [name] => のび太
            [gender] => man
            [type] => human
        )

    [2] => Array
        (
            [id] => 2
            [name] => ドラえもん
            [gender] => man
            [type] => robot
        )

    [3] => Array
        (
            [id] => 3
            [name] => ジャイアン
            [gender] => man
            [type] => human
        )

    [4] => Array
        (
            [id] => 4
            [name] => スネ夫
            [gender] => man
            [type] => human
        )

    [5] => Array
        (
            [id] => 5
            [name] => しずか
            [gender] => woman
            [type] => human
        )

    [6] => Array
        (
            [id] => 6
            [name] => ドラミ
            [gender] => woman
            [type] => robot
        )

)

キーを指定したカラムでグループ化した配列を取得する

先頭のカラムをキーをグループ化した配列で取得できます。

値となるカラムを1つに指定するか、複数取得できる三次元配列で取得するかで、SELECTの指定とfetchの引数が異なります。

グループ化したキーと単一のカラムで取得する場合

先頭カラムをグループ化したキーに、2つ目に指定したカラムはそれぞれのグループ毎に振り分けます。

サンプルコード
$sql = "SELECT type, name FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);
print_r($aryList);
Array
(
    [human] => Array
        (
            [0] => のび太
            [1] => ジャイアン
            [2] => スネ夫
            [3] => しずか
        )

    [robot] => Array
        (
            [0] => ドラえもん
            [1] => ドラミ
        )

)

グループ化したキーと各カラム毎の配列で取得する場合

先頭カラムをグループ化したキーに、2つ目以降に指定したカラムをグループ毎に振り分けます。

サンプルコード
$sql = "SELECT type, doraemon_users.* FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_GROUP);
print_r($aryList);
Array
(
    [human] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => のび太
                    [gender] => man
                    [type] => human
                )

            [1] => Array
                (
                    [id] => 3
                    [name] => ジャイアン
                    [gender] => man
                    [type] => human
                )

            [2] => Array
                (
                    [id] => 4
                    [name] => スネ夫
                    [gender] => man
                    [type] => human
                )

            [3] => Array
                (
                    [id] => 5
                    [name] => しずか
                    [gender] => woman
                    [type] => human
                )

        )

    [robot] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [name] => ドラえもん
                    [gender] => man
                    [type] => robot
                )

            [1] => Array
                (
                    [id] => 6
                    [name] => ドラミ
                    [gender] => woman
                    [type] => robot
                )

        )

)

四次元以上のグループの分岐が必要な場合は、取得した配列を整形することで再現可能

上記の例は、人間かロボットかでグループ化していましたが、さらに男女で分岐も必要な場合に対応したメソッドや引数はありません。(多分…もしあったらご指摘ください)

その場合は一旦取得した配列を再度ループし代入し直すことで、理想の形でグループ化することで再現できます。

繰り返し処理はお馴染みのforeachでループさせ、新規の配列を生成します。

参考 PHPのforeachを徹底解説【サンプルコード有】

サンプルコード
$sql = "SELECT * FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryHoge = $sth -> fetchAll(PDO::FETCH_ASSOC);

$aryList = [];
foreach($aryHoge as $value){
    $aryList[$value['type']][$value['gender']][] = $value;
}

print_r($aryList);
Array
(
    [human] => Array
        (
            [man] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => のび太
                            [gender] => man
                            [type] => human
                        )

                    [1] => Array
                        (
                            [id] => 3
                            [name] => ジャイアン
                            [gender] => man
                            [type] => human
                        )

                    [2] => Array
                        (
                            [id] => 4
                            [name] => スネ夫
                            [gender] => man
                            [type] => human
                        )

                )

            [woman] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => しずか
                            [gender] => woman
                            [type] => human
                        )

                )

        )

    [robot] => Array
        (
            [man] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => ドラえもん
                            [gender] => man
                            [type] => robot
                        )

                )

            [woman] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [name] => ドラミ
                            [gender] => woman
                            [type] => robot
                        )

                )

        )

)

四次元以上の配列が必要となった場合にご活用頂けます。

返り値となる配列を定義した関数を通して取得する

配列の結果に対して、各行毎に指定した関数に通した結果を取得することもできます。

サンプルコード
function doraemons_comment($name, $gender, $type){
    $aryGender = ['man' => '男の子', 'woman' => '女の子'];
    $aryType = ['human' => '人間', 'robot' => 'ロボット'];
    
    return $name.'は'.$aryGender[$gender].'の'.$aryType[$type].'です。';
}

$sql = "SELECT name, gender, type FROM doraemon_users";
$sth = $pdo -> query($sql);
$aryList = $sth -> fetchAll(PDO::FETCH_FUNC, "doraemons_comment");
print_r($aryList);
Array
(
    [0] => のび太は男の子の人間です。
    [1] => ドラえもんは男の子のロボットです。
    [2] => ジャイアンは男の子の人間です。
    [3] => スネ夫は男の子の人間です。
    [4] => しずかは女の子の人間です。
    [5] => ドラミは女の子のロボットです。
)

PDO::FETCH_FUNCに続く第二引数で、指定の関数の戻り値を取得します。

関数の引数には、SELECTで指定したカラムの数と同じ数になるよう調整してください。


自分に対しての備忘録として、今回のPDOの配列パターンをまとめました。

公式のマニュアルも一度目を通しておいてください。

https://www.php.net/manual/ja/pdostatement.fetchall.php

取得できる配列のパターンを事前に知っておくことで、より効率的な開発が出来ますので是非チェックしておきましょう。

以上、PDOのfetchで取得できる配列パターン一覧、でした。

PHP