Могу ли я использовать PDO :: FETCH_GROUP для группировки результатов по двум значениям

Я использую 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] } 

Как я могу группировать по столбцам 1 и столбцу2, чтобы получить что-то вроде:

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

Возможно ли это с комбинацией констант PDO?

благодаря

Как вы видели, можно легко легко перестроить массив, сгруппировав его с одним указанным столбцом с помощью PDO::FETCH_GROUP . То, что вам нужно, это преобразовать 2-мерный массив (результат из базы данных) в 3-мерный массив, но его невозможно перестроить таким образом.

Вам нужно сделать это вручную через вложенные циклы. Это довольно просто, например:

 // 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" } } } 

и это похоже на то, что вам нужно.

Вы лучше 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"]; }