Коллекционная группа Laravel по двум колонкам - PullRequest
0 голосов
/ 14 мая 2019

У меня есть массив часов открытия / закрытия магазина:

array:3 [▼
  1 => array:2 [▼
    "opens_at" => "10:00"
    "closes_at" => "18:00"
  ]
  2 => array:2 [▼
    "opens_at" => "10:00"
    "closes_at" => "18:00"
  ]
  3 => array:2 [▼
    "opens_at" => "10:00"
    "closes_at" => "18:00"
  ]
  4 => array:2 [▼
    "opens_at" => "14:00"
    "closes_at" => "17:00"
  ]
  5 => array:2 [▼
    "opens_at" => "14:00"
    "closes_at" => "17:00"
  ]
  6 => array:2 [▼
    "opens_at" => "18:00"
    "closes_at" => "19:00"
  ]
]

ключи массива здесь от 1 до 6 - это дни (с понедельника по субботу) в этом случае, и я 'используя для этого простой класс Enum:

class WeekDays
{
    const MONDAY = 1;
    const TUESDAY = 2;
    const WEDNESDAY = 3;
    const THURSDAY = 4;
    const FRIDAY = 5;
    const SATURDAY = 6;
    const SUNDAY = 7;
}

Итак, мне нужно получить результат, который группирует дни с одинаковыми часами открытия и закрытия следующим образом:

[
    Mo,Tu,We 10:00-18:00,
    Th,Fr 14:00-17:00
    Sa 18:00-19:00
]

Iне могу понять, как группировать по opens_at & closes_at, чтобы получить какой-либо отформатированный результат, как я показал.Заранее спасибо!

1 Ответ

2 голосов
/ 14 мая 2019

Не очень элегантное решение, но оно может дать вам подсказку, как вы можете решить его самостоятельно:

<?php

$a = [
  1 => [
    "opens_at" => "10:00",
    "closes_at" => "18:00"
  ],
  2 => [
    "opens_at" => "10:00",
    "closes_at" => "18:00"
  ],
  3 => [
    "opens_at" => "10:00",
    "closes_at" => "18:00"
  ],
  4 => [
    "opens_at" => "14:00",
    "closes_at" => "17:00"
  ],
  5 => [
    "opens_at" => "14:00",
    "closes_at" => "17:00"
  ],
  6 => [
    "opens_at" => "18:00",
    "closes_at" => "19:00"
  ]
];

$groups = [];

foreach($a as $dayNumber => $w){
    if(!array_key_exists($w['opens_at'] . '-' . $w['closes_at'], $groups)){
        $groups[$w['opens_at'] . '-' . $w['closes_at']] = [];
    }

    $groups[$w['opens_at'] . '-' . $w['closes_at']][] = $dayNumber;
}

$res = array_map(function($v){
    return implode(', ', $v);
}, $groups);

var_dump(array_flip($res));

Результат:

array(3) { ["1, 2, 3"]=> string(11) "10:00-18:00" ["4, 5"]=> string(11) "14:00-17:00" [6]=> string(11) "18:00-19:00" }

https://3v4l.org/p4oa6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...