Задать вопрос
@tohin15

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

Есть массив с днями недели и часами работы
$openingHours = [
            ['day' => 'monday', 'time' => '08:00-20:00'],
            ['day' => 'tuesday', 'time' => '08:00-20:00'],
            ['day' => 'wednesday', 'time' => '08:00-20:00'],
            ['day' => 'thursday', 'time' => '10:00-20:00'],
            ['day' => 'friday', 'time' => '10:00-18:00'],
            ['day' => 'saturday', 'time' => '10:00-16:00'],
            ['day' => 'sunday', 'time' => '10:00-16:00'],
        ];

Необходимо сгруппировать его так, чтобы дни с одинаковыми часами работы объединялись в один элемент. Примерно так
$result = [
            'monday - wednesday' => '08:00-20:00',
            'thursday' => '10:00-20:00',
            'friday' => '10:00-18:00',
            'saturday - sunday' => '10:00-16:00',
        ];

Как этого можно добиться? Спасибо!
  • Вопрос задан
  • 1039 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
GomelHawk
@GomelHawk
PHP / Symfony developer
Если предположить, что дни недели упорядочены по возрастанию, то можно использовать что-нибудь такое:

$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);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Vlad_IT
@Vlad_IT
Front-end разработчик
Решение в лоб: создаете ассоциативный массив, где ключ - время, значение - массив дней недели. И просто проходите каждый элемент $openingHours, берете с него время, проверяете, есть ли оно в нашем созданном массиве, если нет, создаем и добавляем туда день, если есть, то просто добавляем туда день.
Ну, потом уже пишите функцию, которая преобразует наш созданный массив в тот, что вам нужно. Это тоже довольно просто, смотрим ключ, берем его значения, соединяем их через разделитель -, и используем как ключ в новом массиве.
Ответ написан
Eridani
@Eridani
Мимо проходил
Если по замыслу Владимир Проскурин
$openingHours = [
            ['day' => 'monday', 'time' => '08:00-20:00'],
            ['day' => 'tuesday', 'time' => '08:00-20:00'],
            ['day' => 'wednesday', 'time' => '08:00-20:00'],
            ['day' => 'thursday', 'time' => '10:00-20:00'],
            ['day' => 'friday', 'time' => '10:00-18:00'],
            ['day' => 'saturday', 'time' => '10:00-16:00'],
            ['day' => 'sunday', 'time' => '10:00-16:00'],
        ];
$temp = array();
$result = array();

foreach($openingHours as $key => $item) {
  $temp[$item['time']][] = $item['day']; 
}
foreach($temp as $key => $item){
  $count = count($item) -1;
  $count >= 1 ? $result[$item[0].'-'.$item[$count]] = $key : $result[$item[0]] = $key; 
}
print_r($result);


Array
(
    [monday-wednesday] => 08:00-20:00
    [thursday] => 10:00-20:00
    [friday] => 10:00-18:00
    [saturday-sunday] => 10:00-16:00
)


P.S. На другие реализации или упрощение вышеописанного и сам с удовольствием посмотрю
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы