我想将特定数据库的内容存储到一个数组中,并按其主键分组。 (代替了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)对它们进行分组?
您可以使用
$results = array_map('reset', $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC))
这应该产生您想要的东西:
$results = $pdos->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
我决定只用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)作为数组键的名称,然后将数据添加到其中。
[我想在解决此问题时将其添加为答案,这要归功于大家的帮助,我希望这对希望实现同一目标的其他人有所帮助。
我想指出唯一适用于我的解决方案:
fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
请注意,这将从结果集中删除第一列。因此查询必须是:
SELECT id_keyname AS arrkey, id_keyname, .... FROM ...
所以,我的问题是;我可以按它们将每个数组分组吗主键(ID)
当然,您这里有2个选项:更改查询或解析结果集。因此,我确定您不想更改查询本身,因此我将解析结果集。
注意:您应该使用准备好的SQL语句。如果要绑定一些参数,则可以。但是在这种情况下,您只想获取结果集,因此$myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) {
$temp2 = $temp['id'];
unset($temp['id']);
$returnArray[$temp2] = $temp;
return $returnArray;
}
);
和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') ....)