2013-04-02 10 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

、これはコードIです使用持っており、それだけで正常に動作します:配列のキーの名前として、主キー(というid)を使用しています

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

をし、それにデータを追加します。

私はこれを解決してくれた人たちのおかげで、これを答えとして追加しました。これは、これが同じことを達成することを望んでいる誰にとっても役立つことを願っています。

:私は私の作品唯一のソリューションを指摘したいと思います

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

だから、私の質問がある

おかげでグループに私のために可能です。それは各アレイは(IDです)その 主キーによってグループに私のために可能である

コースオフ、あなたはここで2つのオプションがあります:どちらか一方は、クエリを変更したり、結果セットを解析します。 それでは、クエリ自体を変更したくないと思いますので、結果セットを解析することになります。

注: 準備された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)) 

そして、あなたがしたい::

だから、あなたが持っている

$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

私はまだあなたを示唆しています:

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

さて、あなたはこのような何かを行うことができますループを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'は配列の配列を返します。最初の列はキーとして使用され、key内はそのキーのすべての結果の配列です。ただし、このシナリオでは、各キーには1行しか含まれません。 'reset'はarrayの最初の要素を返します。したがって、1つのネスティングレベルが削除されます。 – mpen

+0

素晴らしいです、ありがとう! – showdev

5

を使用することができますfetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);

これは、結果セットの最初の列を削除することに注意してください。クエリは次のようにする必要があります。

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

+0

これは答えになるはずです。ありがとうございました。 –

2

+1

**これは最適な解決策です。**しかし、PDO :: FETCH_UNIQUEのビットはPDO :: FETCH_GROUPを含んでいるので、 'PDO :: FETCH_ASSOC | PDO :: FETCH_UNIQUE'を指定するだけです。 – mpyw

関連する問題