【问题标题】:PDO fetchAll() primary key as array group keyPDO fetchAll() 主键作为数组组键
【发布时间】:2013-04-02 01:05:52
【问题描述】:

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

【问题讨论】:

  • 使用fetch() 循环结果。
  • 我可以做到这一点.. 但这不会破坏甚至拥有 fetchAll() 函数的目的吗? @hjpotter92

标签: php pdo


【解决方案1】:

你可以使用

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是如果我仍然想在结果数组中拥有主键值,同时我希望这个主键成为记录详细信息本身的键呢?因为这个解决方案从结果中删除了“id”并使其成为结果的关键
    【解决方案3】:

    我决定用 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)作为数组键的名称,然后将数据添加到其中。

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 这是最好的解决方案。 但是,PDO::FETCH_UNIQUE 的位包含 PDO::FETCH_GROUP,因此您只需指定 PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE
      【解决方案5】:

      我仍然建议您使用fetch() 方法进行循环。否则,您可以使用 array_reduce() 来遍历数组。 codepad is here 上的示例。

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

      $myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) { 
          $temp2 = $temp['id']; 
          unset($temp['id']); 
          $returnArray[$temp2] = $temp; 
          return $returnArray;
        }
      );
      

      【讨论】:

        【解决方案6】:

        所以,我的问题是;我可以按每个数组对它们进行分组吗 主键(即 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(...)))
        

        【讨论】:

          猜你喜欢
          • 2011-11-19
          • 2013-08-20
          • 1970-01-01
          • 2019-06-01
          • 2011-08-28
          • 2014-02-02
          • 1970-01-01
          • 2012-09-08
          • 2012-11-12
          相关资源
          最近更新 更多