2013-03-20 7 views
8

ho questo codice:DOP array associativi - ritorno associative

$dbInstance = DB_Instance::getDBO(); 
$statement = $dbInstance->prepare("SELECT id, name FROM language ORDER BY id"); 
$statement->execute();  
$rows = $statement->fetchAll(); 

//Create associative array wuth id set as an index in array 
$languages = array(); 
foreach($rows as $r) { 
    $languages[$r['id']] = $r['name']; 
} 
return $languages; 

io non riesco a capire come usare PDO-dichiarazione per ottenere lo stesso risultato che array $ lingue produce. Ho provato diversi stili_fetch.

ho provato alcuni stili diversi e ho potuto ottenere come:

[0] svenska 
[1] engelska 

ma voglio piace:

[1] svenska 
[2] engelska 

(dove 1 e 2 sono i valori di id nel database)

Immagino di poter creare una funzione e chiamarla con FETCH_FUNC ma non sono sicuro che sarebbe altrettanto bello.

È il modo migliore/più pulito per farlo?

+3

Se si desidera restituire un array associativo con DOP, non '$ rows = $ statement-> fetchAll (DOP :: FETCH_ASSOC);' Poi è possibile fare riferimento da '$ rows [$ row_num] [$ col_name] ' – jdstankosky

+0

Capisco cosa stai chiedendo ora. Si prega di consultare la mia risposta aggiornata per rispondere alla vostra richiesta particolare. – jdstankosky

risposta

10

Non realmente sicuro se c'è un modo migliore. Potresti provare questo?

$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

$languages = array(); 

function getLangs($col, $row) { 
    $languages[$col['id']] = $col['name']; 
} 

array_walk($rows, 'getLangs'); 

Non c'è niente di sbagliato nei cicli foreach. In realtà userò quello che hai. E 'difficile ottenere più pulita di quella ...

UPDATE:

Dopo aver attentamente riletto la tua domanda, ciò che veramente dovrebbe chiedere è se è possibile formattare la query in modo tale che i risultati vengono restituiti in un formato diverso.

Il modo in cui il vostro normale query SELECT viene restituito è così:

+----+----------+ 
| id |  name | 
+----+----------+ 
| 1 | svenska | 
| 2 | engelska | 
| .. |  ... | 
| .. |  ... | 
+----+----------+ 

$row = array(
    row_1 => array(
     id => "1", 
     name => "svenska" 
    ), 
    row_2 => array(
     id => "2", 
     name => "engelska" 
    ), 
    row_3 => array(
     id => "...", 
     name => "..." 
    ), 
    row_4 => array(
     id => "...", 
     name => "..." 
    ) 
) 

$row[$row_number][$column_name] = $value 

Quello che stai chiedendo è per un modo per restituire i risultati della query in questo modo:

// Query result is only one row, with each 'id' as column name 
// And the 'name' from the same row as it's value... 

+---------+----------+-----+-----+-----+ 
|  1 |  2 | ... | ... | ... | 
+---------+----------+-----+-----+-----+ 
| svenska | engelska | ... | ... | ... | 
+---------+----------+-----+-----+-----+ 

$row = array(
    row_1 => array(
      1 => "svenska", 
      2 => "engelska", 
     ... => "...", 
     ... => "...", 
     ... => "..." 
    ) 
) 

$languages = $row[row_1]; 
$languages[$id] = $name; 

I' Non sono del tutto sicuro che tu possa scrivere do this in SQL, per essere perfettamente onesto. Lo raccomanderei anche contro, anche se potessi. Sarebbe orrendo per un tavolo di scale. Se il tuo tavolo è statico, perché non formattarlo nel modo in cui ho appena menzionato per cominciare? Perché non averlo solo in un array PHP statico in un file di inclusione?

+0

Grazie MOLTO! :-) Cosa intendi.Perché dovrei includerlo in un array PHP statico in un file include? Qual è il punto di questo? – bestprogrammerintheworld

+0

@bestprogrammerintheworld Non sapevo se fosse una tabella statica, come in, le lingue saranno sempre lì, e l'unica ragione per cui sono nel database è cercarle con una query, perché non creare semplicemente una matrice di loro nel tuo script manualmente (es., 'include" lang.php ";'? Ancora una volta, non ho altra conoscenza del tavolo in questione, quindi qui sto solo supponendo .. – jdstankosky

+0

Ok, grazie per il suggerimento! -) – bestprogrammerintheworld

13

Tutti dimenticato la

$sth->fetchAll(PDO::FETCH_KEY_PAIR); 
+0

Se si lavora con più di una colonna, questa potrebbe essere una soluzione migliore: '$ STH-> fetchAll (PDO :: FETCH_ASSOC);' – dangre00