2013-03-20 16 views
8

Ich habe diesen Code:PDO assoziativer Arrays - Rückkehr assoziative

$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; 

ich nicht herausfinden kann, wie PDO-Anweisung verwenden, um das gleiche Ergebnis, die Array $ Sprachen produziert zu erreichen. Ich habe verschiedene fetch_styles ausprobiert.

Ich habe einige verschiedene Stile ausprobiert und ich konnte wie bekommen:

[0] svenska 
[1] engelska 

aber ich möchte gerne:

[1] svenska 
[2] engelska 

(wobei 1 und 2 sind die Werte von id in der Datenbank)

Ich denke, ich könnte eine Funktion erstellen und das mit FETCH_FUNC anrufen, aber ich bin mir nicht sicher, dass das auch so toll wäre.

Ist das oben genannte der beste/sauberste Weg, es zu tun?

+3

Wenn Sie ein assoziatives Array mit PDO zurückkehren möchten, tun '$ rows = $ Anweisung-> fetchAll (PDO :: FETCH_ASSOC);' Dann können Sie durch '$ Referenz Zeilen [$ row_num] [$ col_name] ' – jdstankosky

+0

Ich verstehe, was Sie jetzt fragen. Bitte beachten Sie meine aktualisierte Antwort, um Ihre spezielle Anfrage zu beantworten. – jdstankosky

Antwort

10

nicht wirklich sicher, ob es einen besseren Weg gibt. Du könntest das versuchen?

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

$languages = array(); 

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

array_walk($rows, 'getLangs'); 

Es ist nichts falsch mit foreach-Schleifen. Ich würde tatsächlich verwenden, was du hast. Es ist schwer zu bekommen sauberer als die ...

UPDATE:

Nach sorgfältigem Ihrer Frage erneut zu lesen, was Sie sollen sich wirklich fragen, ob Sie Ihre QUERY so formatiert werden können, dass die Ergebnisse werden in einem anderen Format zurückgegeben.

Die Art und Weise, die Ihre normalen SELECT-Abfrage ist thusly zurückgegeben:

// 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; 

Ich:

+----+----------+ 
| 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 

für was Sie fordern für eine Möglichkeit, Ihre Abfrage-Ergebnisse hier wie zurückzukehren m nicht ganz sicher, Sie können do this in SQL, um ganz ehrlich zu sein. Ich würde es auch empfehlen, auch wenn Sie könnten. Es wäre schrecklich für einen Skaliertisch. Wenn Ihr Tisch statisch ist, warum formatieren Sie ihn nicht so, wie ich es gerade erwähnt habe? Warum nicht einfach in einem statischen PHP-Array in einer Include-Datei?

+0

Vielen Dank! :-) Was meinen Sie.Warum sollte ich dies in ein statisches PHP-Array in einer Include-Datei aufnehmen? Was ist der Sinn davon? – bestprogrammerintheworld

+0

@bestprogrammerintheworld Ich wusste nicht, ob es eine statische Tabelle war, wie in, die Sprachen werden immer da sein, und der einzige Grund, warum sie in der Datenbank sind, ist sie mit einer Abfrage zu suchen, warum nicht einfach ein Array erstellen von ihnen in Ihrem Skript manuell (dh, 'include" lang.php ";"? Wieder habe ich keine anderen Kenntnisse über die Tabelle in Frage, so dass ich nur hier folge. – jdstankosky

+0

Ok, danke für den Tipp!: -) – bestprogrammerintheworld

13

Jeder vergaß die

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

Wenn Sie mit mehr als einer Spalte arbeiten, könnte dies eine bessere Lösung sein: '$ STH-> fetchAll (PDO :: FETCH_ASSOC);' – dangre00

Verwandte Themen