Laravel 集合由两列组成

问题描述 投票:0回答:2

我有一系列商店的营业/关门时间:

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
]

我不知道如何按

opens_at
closes_at
进行分组以获得我所示的任何格式化结果。预先感谢!

php arrays laravel
2个回答
2
投票

这不是一个非常优雅的解决方案,但它可以给你一个如何自己解决它的提示:

<?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


0
投票
  1. 循环使用反射从类常量构建查找数组,然后使用字符串操作函数。

  2. 按时间范围循环分组

  3. 循环重新格式化分组数据。

代码:(演示

$lookup = array_map(
    fn($v) => mb_convert_case(substr($v, 0, 2), MB_CASE_TITLE),
    array_flip(
        (new ReflectionClass('Weekdays'))->getConstants()
    )
);
//var_export($lookup);

$result = [];
foreach ($array as $i => $row) {
    $range = implode('-', $row);
    if (!isset($result[$range])) {
      $result[$range] = $lookup[$i];
    } else {
      $result[$range] .= ',' . $lookup[$i];
    }
}

var_export(
    array_map(
        fn($k, $v) => "$v $k",
        array_keys($result),
        $result
    )
);

输出(完全符合要求):

array (
  0 => 'Mo,Tu,We 10:00-18:00',
  1 => 'Th,Fr 14:00-17:00',
  2 => 'Sa 18:00-19:00',
)
© www.soinside.com 2019 - 2024. All rights reserved.