2011-09-16 14 views
36

De vez en cuando, yo entrar en una situación en la que tengo una consulta similar en especie a:grupo DOP fetchAll en matriz asociativa

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

En este caso, quiero tener una asociativo array, usando valores de key & value como entradas respectivas de esa matriz, por ejemplo si la base de datos contenía: ('first_name', 'Tom'), ('last_name', 'Jeferson'), la matriz debería ser array('first_name' => 'Tom', 'last_name' => 'Jeferson');.

La forma más común de hacer esto es:

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

* La otra manera de hacer esto es llamando fetchAll(PDO::FETCH_COLUMN) dos veces & a continuación, utilizando array_combine para crear la matriz. Sin embargo, como implica dos llamadas dos a la base de datos, dejo esto como una opción.

¿Hay alguna otra manera de hacerlo?

Respuesta

76

para su problema existe una solución bastante listo, es decir:

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

funciona para mí, en PostgreSQL 9.1, 5.3.8 y PHP se ejecutan en Windows 7 x64.

+3

Genial! No sabía acerca de esta constante. Aparentemente, la página de documentación de búsqueda de PDO no los incluye a todos. Sin embargo, el bit 'AS name, AS value' es redundante. – Gajus

+0

Además, no sabía, mi IDE lo destacó por mí ...) – devdRew

+1

¿Hay alguna manera de usar 'PDO :: FETCH_KEY_PAIR' y tener el resultado como un' objeto' al mismo tiempo? – adamj

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