@Norbyt

Как сгруппировать массив по его значениям?

Заранее говорю работаю с битрикс.
Задача состоит в том, что на каждый день недели в инфоблоке есть множественное свойство(2 поля), в котороые записываются время начало и окончания работы магазина.
5c0944a9ab3c48fcbb42242bef0dd86c.png
Получаемый массив выглядит следующим образам:
Array ( [Понедельник] => Array ( [0] => 9:00 [1] => 19:00 ) [Вторник] => Array ( [0] => 9:00 [1] => 19:00 ) [Среда] => Array ( [0] => 9:00 [1] => 19:00 ) [Четверг] => Array ( [0] => 9:00 [1] => 19:00 ) [Пятница] => Array ( [0] => 9:00 [1] => 19:00 ) [Суббота] => Array ( [0] => 9:00 [1] => 19:00 ) [Воскресенье] => Array ( [0] => 10:00 [1] => 16:00 ) )

Нужно сгруппировать данные по времени например:
Понедельник - Вторник с 9:00 до 19:00
Воскресенье с 10:00 до 16:00

Нужен ваш совет как это сделать.
Заранее спасибо.
  • Вопрос задан
  • 231 просмотр
Решения вопроса 2
1. Создаете выходной массив.
2. Определяетесь с тем, что будет ключом в нем. Это может быть, например, особым образом сформированная строка из элементов очередного элемента входного массива (например, «9:00 — 19:00») или сериализованный очередной элемент.
3. Пробегаете в цикле по входному. Каждый очередной элемент входного состоит из ключа (день недели) и значения (массив с двумя значениями времени). Так вот, из значения элемента входного массива формируйте ключ выходного (как описано в п.2).
4. В элемент выходного массива по сформированному ключу добавляете ключ элемента входного.

То есть выходной массив будет примерно такой:
Array (
[9:00 — 19:00] => Array ( [0] => Понедельник [1] => Вторник … )
[10:00 — 16:00] => Array ( [0] => Воскресенье ) )


А дальше уже, исходя из требований, формировать выходные строки с перечислениями дней или с формированием диапазонов.
Ответ написан
Комментировать
kimono
@kimono
Web developer
$week = [
  'Понедельник' => [0 => '9:00', 1 => '19:00'],
  'Вторник'     => [0 => '9:00', 1 => '19:00'],
  'Среда'       => [0 => '9:00', 1 => '19:00'],
  'Четверг'     => [0 => '10:00', 1 => '14:00'],
  'Пятница'     => [0 => '9:00', 1 => '19:00'],
  'Суббота'     => [0 => '9:00', 1 => '19:00'],
  'Воскресенье' => [0 => '10:00', 1 => '16:00']
];

$data = [];
$current = '';
$i = 0;

foreach ($week as $day => $schedule) {
  if ($current !== $schedule) {
    $current    = $schedule;
    $data[$i++] = ['start' => $day, 'end' => $day, 'time' => implode(' - ', $schedule)];
  }
  $data[$i - 1]['end'] = $day;
}
foreach ($data as $id => $row) {
  $data[$id] = [implode(' - ', array_unique([$row['start'], $row['end']])) => $row['time']];
}
var_dump($data);

на выходе:
'Понедельник - Среда' => '9:00 - 19:00'
'Четверг' => '10:00 - 14:00'
'Пятница - Суббота' => '9:00 - 19:00'
'Воскресенье' =>  '10:00 - 16:00'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы