web-dev-qa-db-ja.com

PDO fetchAllは、キーと値のペアを連想配列にグループ化します

私は時々、次のようなクエリを持っている状況に陥ります。

SELECT `key`, `value` FROM `settings`;

この場合、keyvalueの値をその配列のそれぞれのエントリとして使用して、連想配列を取得します。データベースに('first_name', 'Tom'), ('last_name', 'Jeferson')が含まれている場合、配列はarray('first_name' => 'Tom', 'last_name' => 'Jeferson');である必要があります。

これを行う最も一般的な方法は次のとおりです。

$settings_flat = $db
    ->query("SELECT `name`, `value` FROM `settings`;")
    ->fetchAll(PDO::FETCH_ASSOC);

$settings   = array();

foreach ($settings_flat as $setting) {
    $settings[$setting['name']] = $setting['value'];
}

*これを行うもう1つの方法は、fetchAll(PDO::FETCH_COLUMN)を2回呼び出してからarray_combineを使用して配列を作成することです。ただし、データベースへの2つの呼び出しが含まれるため、これはオプションとして省略します。

これを行う別の方法はありますか?

40
Gajus

あなたの問題については、かなり簡単な解決策があります:

$q = $db->query("SELECT `name` AS name, `value` AS value FROM `settings`;");
$r  = $q->fetchAll(PDO::FETCH_KEY_PAIR);

PostgreSQL 9.1、およびWindows 7 x64で実行されているPHP 5.3.8で動作します。

87
devdRew