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

时间:2013-04-02 01:05:52

标签: php pdo

所以我现在已经和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)对每个数组进行分组

由于

6 个答案:

答案 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(...)))