2012-10-11 9 views
12

カラムid、name、urlを持つ 'brands'というSQLテーブルがあります。そのテーブルの 私は、このデータセットを持っている:PDOを使用した結果でカラムの値をインデックスとして使用

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

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

答えて

13

はマニュアル連想

として取得:をPDOStatementに記載されているよう http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

は、返される配列の内容を制御::()を取得します。デフォルト値はPDO :: ATTR_DEFAULT_FETCH_MODE(デフォルトはPDO :: FETCH_BOTH)

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

結果セットから、PDO :: FETCH_UNIQUEを指定したビット単位のOR PDO :: FETCH_COLUMNを使用して、単一の列の一意の値のみをフェッチします。

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

最後のビットがキーです。 (私は見つけることができることを)完全に文書化されていないようですが、その代わりにPDO :: FETCH_COLUMN、あなたは望ましい結果を達成するためにPDO :: FETCH_GROUPとPDO :: FETCH_ASSOCを組み合わせることができますので、

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

を((のvar_dumpのように、KINTライブラリからわずか便利なデバッグ機能です)D()またはますprint_r())

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" 
     ] 
    ] 
] 

:中

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

結果:、上記のデータを与えられました

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

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

+4

$ st-> fetchAll(PDO :: FETCH_ASSOC | PDO :: FETCH_GROUP); それは仕事をした、助けてくれてありがとう! –

12

PHPマニュアルのPDO::FETCH_UNIQUEの説明はかなり不明ですが、実際はexact parameter you actually needです。

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE); 

はあなた(あなたのケース内のidでなければなりません*テーブル定義で、最初のフィールドを使用する場合、)最初のSELECT句にリストされたフィールドをインデックスとする配列を与えています。

デフォルトでは、ちょうどPDO::FETCH_UNIQUEを使用すると結果として2倍の値を持つ行が表示されます。この呼び出しに優先行モードを追加するか、コンストラクタ内のすべてのPDO呼び出しに対して1回設定するか、setAttribute()経由で設定することができます。下の出力は、デフォルトのフェッチモードとしてPDO::FETCH_ASSOCが設定されている場合に表示されます。

1 => array (
    'name' => 'Solidfloor', 
    'url' => 'solidfloor', 
), 
    2 => array (
    'name' => 'Quickstep', 
    'url' => 'quickstep', 
), 
    4 => array (
    'name' => 'Cleanfloor', 
    'url' => 'cleanfloor', 
), 
) 
+1

まさに私が探していたもの、ありがとう –