2013-04-02 18 views
5

所以我一直在與PDO工作了幾個月,但是現在我遇到了麻煩。我想將指定數據庫的內容存儲到一個數組中,並按其主鍵分組。 (而不是無用的方式PDO fetchAll()組織它們)。PDO fetchAll()主鍵作爲數組組密鑰

我當前的代碼:

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

然後輸出:

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

我正在考慮使用PDO :: FETCH_PAIR,但我將很快擴大我要的數據量能夠在這個腳本上使用。目前這種方法很有效,但是當我開始擴展下載量和更多客戶端時,顯然數據分組的方式會導致問題。

所以,我的問題是;是否有可能對我來說,每個組由陣列的主鍵(這是ID)

感謝

+0

而是使用'fetch()'循環結果。 – hjpotter92

+0

我可以做到這一點..但是這並沒有打敗即使有一個fetchAll()函數的目的? @ hjpotter92 –

回答

4

我決定只通過結果環路與取(),並將它們輸入到一個數組作爲我走,這是代碼我有使用,它工作得很好:

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

它使用主鍵(即ID)的名稱爲數組鍵,然後將數據添加到它。

以爲我會添加這個答案,因爲這解決了這個問題,這要感謝那些幫助過我的人,我希望這對希望實現同樣目標的任何人都有所幫助。

1

所以,我的問題是;是否有可能對我來說,每個組由數組的 主鍵(這是ID)

關當然,你有兩個選擇在這裏:要麼改變查詢解析結果集。 所以,我相信你不想改變查詢本身,所以我會去解析結果集。

注意: 您應該使用準備好的SQL語句時,他們是有道理的。如果你想綁定一些參數,那麼它的OKAY。但在這種情況下,你只想得到結果集,所以prepare()fetch()會有點過頭。

所以,你必須:

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

你想:

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

那麼,你可以做這樣的事情:

$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

我還是建議你到循環使用fetch()方法。否則,可以使用array_reduce()遍歷數組。 codepad is here上的樣本。

的代碼(以人類可讀的形式)將是:

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

你可以使用

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

解釋這是如何工作的將是太棒了。 – showdev

+1

'PDO :: FETCH_GROUP | PDO :: FETCH_ASSOC'返回一個數組數組。第一列用作鍵,然後在鍵內是該鍵的所有結果的數組。但是,在我們的場景中,每個鍵只包含1行。 'reset'返回數組中的第一個元素,從而消除1層嵌套。 – mpen

+0

太棒了,謝謝! – showdev

5

這應該得到你在找什麼:

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

這應該是答案。謝謝。 –

2

我想指出的是,對我的作品的唯一解決方案:

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

請注意,這將剝離結果集中的第一列。所以查詢必須是:

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

+1

**這是最好的解決方案**但是,PDO :: FETCH_UNIQUE的位包含PDO :: FETCH_GROUP,所以你應該指定'PDO :: FETCH_ASSOC | PDO :: FETCH_UNIQUE'。 – mpyw