3v4l.org

run code in 300+ PHP versions simultaneously
<?php //It is assumed that the sql is perfectly capable of sorting by date ASC, role ASC, name ASC $resultSet = [ ['date' => '01/02/14', 'role' => 'Leader', 'name' => 'Jerry'], ['date' => '01/02/14', 'role' => 'Musician', 'name' => 'Bob'], ['date' => '01/02/14', 'role' => 'Singer', 'name' => 'Carol'], ['date' => '08/02/14', 'role' => 'Leader', 'name' => 'Baz'], ['date' => '08/02/14', 'role' => 'Leader', 'name' => 'Gaz'], ['date' => '08/02/14', 'role' => 'Leader', 'name' => 'Haz'], ['date' => '08/02/14', 'role' => 'Musician', 'name' => 'Charles'], ['date' => '08/02/14', 'role' => 'Singer', 'name' => 'Norman'], ['date' => '15/02/14', 'role' => 'Astronaut', 'name' => 'Neil'], ]; $columnWidth = 20; foreach ($resultSet as ['date' => $date, 'role' => $role, 'name' => $name]) { $nested[$date][$role][] = $name; $dates[$date] = str_pad($date, $columnWidth, " ", STR_PAD_BOTH); $roles[$role] = str_pad($role, $columnWidth, " ", STR_PAD_BOTH); } $totalColumns = count($dates) + 1; // HEADINGS printf( implode("|", array_fill(0, $totalColumns, '%s')) . "\n", str_pad('Roles', $columnWidth, " ", STR_PAD_BOTH), ...array_values($dates) ); // SEPARATOR echo implode("|", array_fill(0, $totalColumns, str_repeat('=', $columnWidth))); // DATA foreach ($roles as $role => $paddedRole) { echo "\n$paddedRole"; foreach ($nested as $date => $roleGroup) { echo '|' . str_pad(implode(', ', $nested[$date][$role] ?? ['-']), $columnWidth, " ", STR_PAD_BOTH); } }
Output for 7.2.0 - 7.2.34, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
Roles | 01/02/14 | 08/02/14 | 15/02/14 ====================|====================|====================|==================== Leader | Jerry | Baz, Gaz, Haz | - Musician | Bob | Charles | - Singer | Carol | Norman | - Astronaut | - | - | Neil

preferences:
148.77 ms | 409 KiB | 5 Q