Simon
Simon

Reputation: 797

Can I use PDO::FETCH_GROUP to group results by two values

I'm using PHP and PDO to retrieve a set of values from a database and then group by the first column, with this code:

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

This means that if my data is in this format:

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

It returns it as:

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

How would I group by Column1 and Column2 so I get something like:

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

Is that possible to do with a combination of PDO constants?

Thanks

Upvotes: 10

Views: 8220

Answers (2)

nereusz
nereusz

Reputation: 86

As you can see, it is possible to rebuild array easily by grouping it with one specified column with PDO::FETCH_GROUP. What you need is to convert 2-dimension array (result from database) to 3-dimensional array, but it is not possible to rebuild it this way.

You need to do it manually via nested loops. It's pretty simple, like these:

// 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);

It returns:

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

and it look like what you needed.

Upvotes: 7

nikita2206
nikita2206

Reputation: 1188

You better ORDER BY Column1 in your query and group result set in your code like this:

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

Upvotes: 1

Related Questions