PDO fetchAll()主键作为数组组键

问题描述 投票:9回答:6

我想将特定数据库的内容存储到一个数组中,并按其主键分组。 (代替了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)对它们进行分组?

php pdo
6个回答
13
投票

您可以使用

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

11
投票

这应该产生您想要的东西:

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

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
投票

我想指出唯一适用于我的解决方案:

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

请注意,这将从结果集中删除第一列。因此查询必须是:

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


2
投票

我仍然建议您使用fetch()方法进行循环。否则,您可以使用array_reduce()遍历数组。 array_reduce()上的样本。

该代码(以人类可读的形式将是:

codepad is here

1
投票

所以,我的问题是;我可以按它们将每个数组分组吗主键(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') ....)
© www.soinside.com 2019 - 2024. All rights reserved.