Как сгруппировать массив по его значениям?
1. Создаете выходной массив. 
2. Определяетесь с тем, что будет ключом в нем. Это может быть, например, особым образом сформированная строка из элементов очередного элемента входного массива (например, «9:00 — 19:00») или сериализованный очередной элемент. 
3. Пробегаете в цикле по входному. Каждый очередной элемент входного состоит из ключа (день недели) и значения (массив с двумя значениями времени). Так вот, из значения элемента входного массива формируйте ключ выходного (как описано в п.2).
4. В элемент выходного массива по сформированному ключу добавляете ключ элемента входного. 
То есть выходной массив будет примерно такой: Array (
[9:00 — 19:00] => Array ( [0] => Понедельник [1] => Вторник … )
[10:00 — 16:00] => Array ( [0] => Воскресенье ) )
А дальше уже, исходя из требований, формировать выходные строки с перечислениями дней или с формированием диапазонов.
1. Создаете выходной массив. 
2. Определяетесь с тем, что будет ключом в нем. Это может быть, например, особым образом сформированная строка из элементов очередного элемента входного массива (например, «9:00 — 19:00») или сериализованный очередной элемент. 
3. Пробегаете в цикле по входному. Каждый очередной элемент входного состоит из ключа (день недели) и значения (массив с двумя значениями времени). Так вот, из значения элемента входного массива формируйте ключ выходного (как описано в п.2).
4. В элемент выходного массива по сформированному ключу добавляете ключ элемента входного. 
То есть выходной массив будет примерно такой: Array (
[9:00 — 19:00] => Array ( [0] => Понедельник [1] => Вторник … )
[10:00 — 16:00] => Array ( [0] => Воскресенье ) )
А дальше уже, исходя из требований, формировать выходные строки с перечислениями дней или с формированием диапазонов.