我有一系列商店的营业/关门时间:
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 与星期几(周一到周六)相关。我为此使用一个简单的枚举类:
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
$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" }
循环使用反射从类常量构建查找数组,然后使用字符串操作函数。
按时间范围循环分组
循环重新格式化分组数据。
代码:(演示)
$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',
)