Простой цикл foreach должен делать это довольно счастливо.
Все, что вам нужно, это запомнить значение Column1, чтобы вы могли определить, когда первичный ключ при отсутствии лучшего слова изменился.
Я протестировал это на CLI, поэтому вам, возможно, придется изменить его, чтобы использовать какой-то HTML, если вы хотите, чтобы он хорошо отображался в браузере.
$arr = [
['Column1'=>'V3' , 'Column2'=>'V1'],
['Column1'=>'V1' , 'Column2'=>'V1'],
['Column1'=>'V2' , 'Column2'=>'V1'],
['Column1'=>'V1' , 'Column2'=>'V2'],
['Column1'=>'V1' , 'Column2'=>'V3'],
['Column1'=>'V1' , 'Column2'=>'V4'],
['Column1'=>'V2' , 'Column2'=>'V2'],
];
$col1 = array_column($arr, 'Column1');
$col2 = array_column($arr, 'Column2');
array_multisort($col1, SORT_ASC, $col2, SORT_ASC, $arr);
$lastKey = null;
foreach($arr as $subarr) {
if ( $lastKey != $subarr['Column1'] ) {
echo $subarr['Column1'] . PHP_EOL;
echo "\t" . $subarr['Column2'] . PHP_EOL;
$lastKey = $subarr['Column1'];
} else {
echo "\t" . $subarr['Column2'] . PHP_EOL;
}
}
РЕЗУЛЬТАТ
V1
V1
V2
V3
V4
V2
V1
V2
V3
V1