所以我现在已经和PDO合作了几个月,但是我遇到了麻烦。我想将指定数据库的内容存储到一个数组中,并按主键分组。 (而不是无用的方式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 :(得分:12)
你可以使用
$results = array_map('reset', $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC))
答案 1 :(得分:10)
这应该产生你想要的东西:
$results = $pdos->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
答案 2 :(得分:5)
我决定用fetch()循环遍历结果,然后将它们输入到数组中,这是我使用的代码,它运行得很好:
$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)作为数组键的名称,然后将数据添加到其中。
以为我会把这个作为答案添加,因为这解决了它,感谢那些帮助过的人,我希望这对任何希望实现同样目标的人都有帮助。
答案 3 :(得分:3)
我想指出唯一对我有用的解决方案:
fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
请注意,这将从结果集中删除第一列。所以查询必须是:
SELECT id_keyname AS arrkey, id_keyname, .... FROM ...
答案 4 :(得分: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;
}
);
答案 5 :(得分: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 ) )
你想要:
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(...)))