16

ID、名前、URL の列を持つ「ブランド」という SQL テーブルがあります。そのテーブルには、次のデータセットがあります。

1, Solidfloor, solidfloor;
2, Quickstep, quickstep;
4, Cleanfloor, cleanfloor;
5, Blue Dolphin, blue-dolphin;
6, Krono, krono;
8, Meister, meister;

私は今それらをすべてフェッチしており、見返りに素敵な配列を取得していますが、配列のインデックスをインクリメントされた数値ではなく、その特定の行の ID にする必要があります。もちろん、結果セットをループすることもできますが、これを行うよりクリーンな方法はありますか?

4

2 に答える 2

13

連想としてフェッチ

マニュアルの場合:http: //php.net/manual/en/pdostatement.fetchall.php

fetch_style

PDOStatement :: fetch()に記載されているように、返される配列の内容を制御します。デフォルト値はPDO::ATTR_DEFAULT_FETCH_MODE(デフォルトはPDO :: FETCH_BOTH)

結果セットから単一列のすべての値で構成される配列を返すには、PDO::FETCH_COLUMNを指定します。column-indexパラメーターを使用して、必要な列を指定できます。

結果セットから単一の列の一意の値のみをフェッチするには、ビット単位で-またはPDO::FETCH_COLUMNとPDO::FETCH_UNIQUEを指定します。

指定された列の値でグループ化された連想配列を返すには、ビット単位で-またはPDO::FETCH_COLUMNとPDO::FETCH_GROUPを指定します。

その最後のビットが重要です。完全に文書化されているようには見えませんが(私が見つけたものです)、PDO :: FETCH_COLUMNの代わりに、PDO::FETCH_ASSOCをPDO::FETCH_GROUPと組み合わせて、目的の結果を得ることができます。

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)

したがって、上記のデータが与えられた場合:

$stmt = $PDO_obj->prepare('select * from brands');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
d($result);

結果:

array (6) [
    '1' => array (1) [
        array (2) [
            'name' => string (10) "Solidfloor"
            'url' => string (10) "solidfloor"
        ]
    ]
    '2' => array (1) [
        array (2) [
            'name' => string (9) "Quickstep"
            'url' => string (9) "quickstep"
        ]
    ]
    '4' => array (1) [
        array (2) [
            'name' => string (10) "Cleanfloor"
            'url' => string (10) "cleanfloor"
        ]
    ]
    '5' => array (1) [
        array (2) [
            'name' => string (12) "Blue Dolphin"
            'url' => string (12) "blue-dolphin"
        ]
    ]
    '6' => array (1) [
        array (2) [
            'name' => string (5) "Krono"
            'url' => string (5) "krono"
        ]
    ]
    '8' => array (1) [
        array (2) [
            'name' => string (7) "Meister"
            'url' => string (7) "meister"
        ]
    ]
]

(d()は、var_dump()やprint_r()のようなkintライブラリの便利なデバッグ関数です)

配列のインデックス作成に使用される列は常に結果の最初の列になるため、selectステートメントを変更して必要な列を選択できることに注意してください。また、インデックス付きの列が各行の配列から削除されることにも注意してください。これを回避するには、selectステートメントに列を2回追加します(つまりselect id, brands.* from brands、など)。

ここに記載されているその他のパラメーターがあります:http://php.net/manual/en/pdostatement.fetch.php、PDO :: FETCH_UNIQUEのように、各インデックスが1回だけ使用されるようにします。

于 2012-10-11T07:32:26.033 に答える