2013-04-02 27 views
5

Bu yüzden birkaç aydır PDO ile çalışıyorum, ancak bir aksama geldim. Belirtilen bir veritabanının içeriğini birincil anahtarlarına göre gruplandırılmış bir dizide saklamak istiyorum. (Yararlı şekilde PDO fetchAll() onları düzenler).PDO dizi grubu anahtarı olarak PDO fetchAll() birincil anahtarı

Benim geçerli kod:

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

sonra çıktılar:

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

ancak ben çok yakında İstiyorum veri miktarını genişleteceğiz PDO :: FETCH_PAIR kullanmak düşündüğünü Bu senaryoda kullanabilecektir. Bu şu anda çalışıyor, ancak indirme miktarını artırmaya başladığımda ve daha fazla müşteri çalışmaya başladığında, açık bir şekilde verilerin gruplandırılma biçimi bir soruna neden oluyor.

Benim sorum şu; onların birincil anahtar her array (id)

+0

Döngü sonuçları getirme()' yerine: Yani sorgu olmalıdır. – hjpotter92

+0

Bunu yapabilirim .. ama bu bir fetchAll() işlevine sahip olmanın amacını ortadan kaldırmaz mı? @ hjpotter92 –

cevap

4

I (getirme) ve ben ilerledikçe bir diziye nasıl girdiyse ile sonuçlar arasında sadece döngü karar, bu kod I kullanılan var ve gayet güzel çalışıyor: dizi anahtarı için adı olarak birincil anahtar (varlık id) kullanan

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

ve sonra içine verileri ekler.

Bunu çözdüğüm için bunu yanıt olarak ekleyebilirim, yardımcı olan adamlar sayesinde ve bu aynı şeyi elde etmeyi ümit eden herkese yardımcı olacağını umuyorum.

: Benim için çalışan tek çözüm işaret etmek istiyorum

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

Yani, benim sorum

sayesinde grubuna benim için mümkündür; Ya veya bir sonuç kümesini ayrıştırmak sorgusunu değiştirmek için: o (id) onların birincil anahtar her dizi

Kapalı Tabii ki, burada 2 seçenek var grubuna benim için mümkündür. Yani, sorgunun kendisini değiştirmek istemediğinizden emin olabilirsiniz, bu yüzden ayrıştırma sonucu belirlenir.

Not: Hazırlanan SQL deyimlerini, anlamlı olduklarında kullanmalısınız. Eğer bazı parametreleri bağlamak istiyorsanız o zaman OKAY. Ancak bu durumda, yalnızca sonuç elde etmeyi istiyorsunuz, bu nedenle prepare() ve fetch() çok yüksek olacaktır.

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

Ve istediğiniz:

Yani, sahip

$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

Hala sizi öneriyorum:

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

Eh, böyle bir şey yapabilirsiniz fetch() yöntemini kullanarak döngü. Aksi halde, dizi üzerinde yinelemek için array_reduce()'u kullanabilirsiniz. codepad is here'da bir örnek.

(Okunabilir biçimde) kodu olacak

:

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

Sadece Bu aradığınızı vermelidir

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

Bunun nasıl çalıştığına dair bir açıklama harika olurdu. – showdev

+1

'PDO :: FETCH_GROUP | PDO :: FETCH_ASSOC' bir dizi diziyi döndürür. İlk sütun anahtar olarak kullanılır ve ardından anahtar içinde bu tuş için tüm sonuçların bir dizisidir. Ancak, senaryoda her anahtar sadece 1 satır içerecektir. 'reset' dizideki ilk elemanı döndürür ve böylece 1 düzey yuvalamayı ortadan kaldırır. – mpen

+0

Harika, teşekkürler! – showdev

5

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

Bunun, ilk sütunu sonuç kümesinden çıkaracağını unutmayın. `Kullanılarak

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

+0

Cevap bu olmalı. Teşekkür ederim. –

2

:

+1

** Bu en iyi çözümdür. ** Ancak, PDO :: FETCH_UNIQUE bitleri PDO :: FETCH_GROUP içerdiğinden, sadece 'PDO :: FETCH_ASSOC | PDO :: FETCH_UNIQUE' değerini belirtmelisiniz. – mpyw

İlgili konular