web-dev-qa-db-fra.com

PDO fetchAll regroupe les paires clé-valeur dans un tableau assoc

De temps en temps, je me retrouve dans une situation où j'ai une requête similaire en nature à:

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

Dans ce cas, je veux obtenir un tableau associatif, en utilisant les valeurs de key & value comme entrées respectives de ce tableau, par exemple si la base de données contient: ('first_name', 'Tom'), ('last_name', 'Jeferson'), le tableau doit être array('first_name' => 'Tom', 'last_name' => 'Jeferson');.

La façon la plus courante de procéder est:

$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'];
}

* L'autre façon de procéder consiste à appeler fetchAll(PDO::FETCH_COLUMN) deux fois puis à utiliser array_combine Pour créer le tableau. Cependant, comme cela implique deux appels, deux la base de données, je laisse cela en option.

Y a-t-il une autre façon de procéder?

40
Gajus

Pour votre problème, il existe une solution assez prête, à savoir:

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

Fonctionne pour moi, sur PostgreSQL 9.1 et PHP 5.3.8 fonctionnant sous Windows 7 x64.

87
devdRew