我可以使用PDO :: FETCH_GROUP将结果分组为两个值

时间:2014-04-24 10:15:06

标签: php mysql sql arrays pdo

我使用PHP和PDO从数据库中检索一组值,然后按第一列分组,使用以下代码:

$result = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_NUM);

这意味着如果我的数据采用以下格式:

|Column1    |Column2    |Column3|
|1          |2          |a|
|1          |2          |b|

将其返回为:

1: {
     [Column2: 2, Column3: a],
     [Column2:2, Column3:b]
    }

我如何按Column1和Column2进行分组,以便得到类似的内容:

1: 
   {
    2:
      {
        Column3: a,
        Column3:b
      }
    }

这可能与PDO常量的组合有关吗?

由于

2 个答案:

答案 0 :(得分:3)

如您所见,通过使用PDO::FETCH_GROUP对一个指定列进行分组,可以轻松地轻松地重建阵列。您需要的是将二维数组(数据库的结果)转换为三维数组,但不可能以这种方式重建它。

您需要通过嵌套循环手动执行此操作。这很简单,就像这样:

// let's assume $result is:
$result = [
    [1, 2, 'a'],
    [1, 2, 'b']
];

$newResult = [];
foreach( $result as $row ) {
    $newResult[$row[0]][$row[1]][] = $row[2];
}

var_dump($newResult);

它返回:

array(1) {
  [1]=>
  array(1) {
    [2]=>
    array(2) {
      [0]=>
      string(1) "a"
      [1]=>
      string(1) "b"
    }
  }
}

它看起来像你需要的。

答案 1 :(得分:0)

您的查询和组中的结果集最好ORDER BY Column1,如下所示:

$grouped = [];
$lastIdx = null;
foreach ($query->fetchAll() as $result) {
    if ($lastIdx !== $result["Column1"]) {
        $grouped[$result["Column1"]] = [$result];
    } else {
        $grouped[$result["Column1"]][] = $result;
    }
    $lastIdx = $result["Column1"];
}