13

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

4

6 回答 6

22

你可以使用

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

PDO::FETCH_GROUP|PDO::FETCH_ASSOC返回一个数组数组。第一列用作键,然后在键内是该键的所有结果的数组。但是,在我们的场景中,每个键只包含 1 行。reset()返回数组中的第一个元素,从而消除 1 级嵌套。

于 2014-04-28T22:53:46.077 回答
15

这应该会产生您正在寻找的东西:

$results = $pdos->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
于 2015-04-16T17:40:00.460 回答
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)作为数组键的名称,然后将数据添加到其中。

想我会添加这个作为答案,因为这解决了它,感谢帮助过的人,我希望这对其他希望实现同样目标的人有所帮助。

于 2013-04-02T11:13:32.813 回答
4

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

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

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

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

于 2015-05-13T09:30:15.370 回答
2

我仍然建议你循环使用fetch()方法。否则,您可以使用array_reduce()来遍历数组。键盘上的示例在这里

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

$myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) { 
    $temp2 = $temp['id']; 
    unset($temp['id']); 
    $returnArray[$temp2] = $temp; 
    return $returnArray;
  }
);
于 2013-04-02T01:57:43.717 回答
1

所以,我的问题是;我是否可以通过主键(即 id)对每个数组进行分组

当然,这里有 2 个选项:更改查询解析结果集。所以,我确定您不想更改查询本身,所以我会解析结果集。

注意: 您应该在有意义的情况下使用准备好的 SQL 语句。如果你想绑定一些参数,那么它就可以了。但在这种情况下,你只想得到结果集,所以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(...)))
于 2013-04-02T01:23:40.760 回答