Как реализовать алгоритм группировки массива по значению?
Решение в лоб: создаете ассоциативный массив, где ключ - время, значение - массив дней недели. И просто проходите каждый элемент $openingHours, берете с него время, проверяете, есть ли оно в нашем созданном массиве, если нет, создаем и добавляем туда день, если есть, то просто добавляем туда день.
Ну, потом уже пишите функцию, которая преобразует наш созданный массив в тот, что вам нужно. Это тоже довольно просто, смотрим ключ, берем его значения, соединяем их через разделитель -, и используем как ключ в новом массиве.
Если предположить, что дни недели упорядочены по возрастанию, то можно использовать что-нибудь такое:$openingHours = [
    ['day' => 'monday', 'time' => '08:00-20:00'],
    ['day' => 'tuesday', 'time' => '08:00-20:00'],
    ['day' => 'wednesday', 'time' => '08:00-23:59'],
    ['day' => 'thursday', 'time' => '08:00-20:00'],
    ['day' => 'friday', 'time' => '08:00-20:00'],
    ['day' => 'saturday', 'time' => '10:00-16:00'],
    ['day' => 'sunday', 'time' => '10:00-16:00'],
];

$result = $active = [];

$openingHours[] = ['day' => '', 'time' => '']; // empty value to simplify code

foreach ($openingHours as $openingHour) {
    if ($active) {
        if ($active['time'] === $openingHour['time']) {
            $active['end'] = $openingHour['day'];
        } else {
            $key          = $active['end'] ? $active['start'] . '-' . $active['end'] : $active['start'];
            $result[$key] = $active['time'];
            $active       = [];
        }
    }
    $active = $active ?: [
        'time'  => $openingHour['time'],
        'start' => $openingHour['day'],
        'end'   => null,
    ];
}

print_r($result);