2011-09-16 12 views
36

di tanto in tanto, mi trovo in una situazione in cui ho una query simile in natura a:gruppo DOP fetchAll coppie chiave-valore in assoc serie

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

In questo caso, voglio ottenere un associativa array, utilizzando i valori di key & value come rispettive voci di tale array, ad esempio se il database contiene: ('first_name', 'Tom'), ('last_name', 'Jeferson'), la matrice deve essere array('first_name' => 'Tom', 'last_name' => 'Jeferson');.

Il modo più comune per farlo è:

$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'altro modo per farlo è chiamando fetchAll(PDO::FETCH_COLUMN) due volte & quindi utilizzando array_combine per creare l'array. Tuttavia, dal momento che coinvolge due chiamate due nel database, tralascio questo come opzione.

C'è un altro modo per farlo?

risposta

76

per il vostro problema non è la soluzione abbastanza pronta, vale a dire:

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

funziona per me, su PostgreSQL 9.1 e PHP 5.3.8 in esecuzione su Windows 7 x64.

+3

Grande! Non sapevo di questa costante. Apparentemente la pagina di documentazione di recupero PDO non li elenca tutti. Però, il bit 'AS nome, AS value' è ridondante. – Gajus

+0

Inoltre, non lo sapevo, il mio IDE me l'ha evidenziato ...) – devdRew

+1

C'è un modo per usare 'PDO :: FETCH_KEY_PAIR' e avere l'output come' oggetto' allo stesso tempo? – adamj

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