2013-04-02 14 views
5

Così ho lavorato con PDO per un paio di mesi, tuttavia sono giunto a un intoppo. Voglio memorizzare i contenuti di un database specificato in una matrice, raggruppati in base alle loro chiavi primarie. (Invece del modo inutile PDO fetchAll() li organizza).PDO fetchAll() chiave primaria come chiave del gruppo di array

mio codice corrente:

$DownloadsPDO = $database->dbh->prepare("SELECT * FROM `downloads`"); 
$DownloadsArray = $DownloadsPDO->execute(); 
$DownloadsArray = $DownloadsPDO->fetchAll(); 

Che poi uscite:

Array ([0] => Array ([id] => 0 [0] => 0 [path] => /xx-xx/testfile.zip [1] => /xx-xx/testfile.zip [name] => Test Script [2] => Test Script [status] => 1 [3] => 1) [1] => Array ([id] => 1 [0] => 1 [path] => /xx-xx/test--file.zip [1] => /xxxx/testfile.zip [name] => New Script-UPDATE [2] => New Script-UPDATE [status] => 1 [3] => 1)) 

stavo considerando di usare DOP :: FETCH_PAIR, però sarò molto presto espandendo la quantità di dati che voglio essere in grado di utilizzare su questo script. Funziona attualmente, ma quando inizio a espandere la quantità di download e più clienti entrano in gioco, ovviamente il modo in cui i dati sono raggruppati causa un problema.

Quindi, la mia domanda è; è possibile per me di raggruppare ogni array per la loro chiave primaria (che è id)

Grazie

+0

Loop i risultati utilizzando 'fetch()', invece. – hjpotter92

+0

Potrei farlo ... ma ciò non impedisce lo scopo di avere anche una funzione fetchAll()? @ hjpotter92 –

risposta

4

ho deciso di appena scorrere i risultati con fetch() e inserirli in un array come vado avanti, questo è il codice che ho hanno usato e funziona bene:

$DownloadsPDO = $database->dbh->query("SELECT * FROM `downloads`"); 
$Array = array(); 
while ($d = $DownloadsPDO->fetch()) { 
    $Array[$d['id']]["id"] = $d['id']; 
    $Array[$d['id']]["name"] = $d['name']; 
    $Array[$d['id']]["path"] = $d['path'];       
} 

// Outputs 
Array ([1] => Array ([id] => 1 [name] => Test Script [path] => /xxxx/testfile.zip) [2] => Array ([id] => 2 [name] => New Script-UPDATE [path] => /xxxx/testfile.zip)) 

che utilizza la chiave primaria (essendo id) come nome per la chiave array, quindi aggiunge i dati in esso.

Pensavo che avrei aggiunto questo come la risposta come questo risolto, grazie ai ragazzi che hanno aiutato e spero che questo è utile a chiunque altro sperando di ottenere la stessa cosa.

1

Quindi, la mia domanda è; è possibile per me di raggruppare ogni array per la loro chiave primaria (che è id)

Fuori rotta, si hanno 2 opzioni qui: o modificare la query o analizzare un risultato-set. Quindi, sono sicuro che non si desidera modificare la query stessa, quindi andrei con il set di risultati di analisi.

Nota: È consigliabile utilizzare istruzioni SQL preparate quando hanno senso. Se si desidera associare alcuni parametri, è OKAY. Ma in questo caso, vuoi solo ottenere get set di risultati, quindi prepare() e fetch() sarà un po 'esagerato.

Quindi, si deve:

Array ([0] => Array ([id] => 0 [0] => 0 [path] => /xx-xx/testfile.zip [1] => /xx-xx/testfile.zip [name] => Test Script [2] => Test Script [status] => 1 [3] => 1) [1] => Array ([id] => 1 [0] => 1 [path] => /xx-xx/test--file.zip [1] => /xxxx/testfile.zip [name] => New Script-UPDATE [2] => New Script-UPDATE [status] => 1 [3] => 1)) 

E si desidera:

Array([id] => Array('bar' => 'foo') ....) 

Beh, si può fare qualcosa di simile:

$stmt = $database->dbh->query("SELECT * FROM `downloads`"); 
$result = array(); 

foreach($stmt as $array){ 

    $result[$array['id']] = $array; 
} 


print_r($result); // Outputs: Array(Array('id' => Array(...))) 
2

sto ancora si suggerisce di loop usando il metodo fetch(). In caso contrario, è possibile utilizzare array_reduce() per iterare sulla matrice. Un campione su codepad is here.

Il codice (in forma leggibile) sarà:

$myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) { 
    $temp2 = $temp['id']; 
    unset($temp['id']); 
    $returnArray[$temp2] = $temp; 
    return $returnArray; 
    } 
); 
10

Si può semplicemente utilizzare

$results = array_map('reset', $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC)) 
+0

Una spiegazione di come funziona sarebbe fantastica. – showdev

+1

'PDO :: FETCH_GROUP | PDO :: FETCH_ASSOC' restituisce una matrice di matrici. La prima colonna viene utilizzata come chiave, quindi all'interno della chiave si trova una matrice di tutti i risultati per quella chiave. Tuttavia, nel nostro scenario ogni chiave conterrà solo 1 riga. 'reset' restituisce il primo elemento dell'array, eliminando così 1 livello di nidificazione. – mpen

+0

Fantastico, grazie! – showdev

5

Questo dovrebbe produrre quello che stai cercando:

$results = $pdos->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC); 
+0

Questa dovrebbe essere la risposta. Grazie. –

2

vorrei sottolineare l'unica soluzione che funziona per me:

fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);

Fare attenzione che questo eliminerà la prima colonna dal set di risultati. Quindi la domanda deve essere:

SELECT id_keyname AS arrkey, id_keyname, .... FROM ...

+1

** Questa è la soluzione migliore. ** Tuttavia, i bit di PDO :: FETCH_UNIQUE contengono PDO :: FETCH_GROUP, quindi è sufficiente specificare 'PDO :: FETCH_ASSOC | PDO :: FETCH_UNIQUE'. – mpyw

Problemi correlati