我的项目有这个Open Days对象数组。
stdClass Object
(
[Mon] => stdClass Object
(
[DAY_NAME] => Mon
)
[Tue] => stdClass Object
(
[DAY_NAME] => Tue
)
[Wed] => stdClass Object
(
[DAY_NAME] => Wed
)
[Sat] => stdClass Object
(
[DAY_NAME] => Sat
)
[Sun] => stdClass Object
(
[DAY_NAME] => Sun
[SPECIAL_START_TIME] => 12:00 am
[SPECIAL_END_TIME] => 08:54 pm
)
)
所以,当我需要打印from open day时,我取数组的第一个元素,而to open day,我取阵列的最后一个元素。但在这期间,星期四和星期五是不营业的。我需要的结果视图是
Mon-Wed, Sat - #some-time-here
Sun - #Some-time-here
我很困惑我应该如何处理这个
因此,从开放到关闭的时间是唯一的实体,而天数是每个实体的相关实体。这表示一个数据结构,其中打开到关闭时间是相关日期地图中的关键。在PHP中,它看起来像这样:
$out = array(
'10:00-18:00' => array('Mon', 'Tue', 'Wed', 'Sat'),
'12:00-17:00' => array('Sun')
);
构建这个数组只需通过一个对象的循环:
$out = array();
foreach($obj as $day => $data) {
$time_key = $data->SPECIAL_START_TIME . '-' . $data->SPECIAL_END_TIME;
if(!array_key_exists($time_key, $out)) {
$out[$time_key] = array();
}
$out[$time_key][] = $day;
}
现在,您必须在天范围内"压缩"连续的天数(array('Mon', 'Tue', 'Wed')
变为'Mon-Wed'
):
$order = array(
'Sun' => 0,
'Mon' => 1,
'Tue' => 2,
'Wed' => 3,
'Thu' => 4,
'Fri' => 5,
'Sat' => 6
);
$in = array('Mon', 'Tue', 'Thu', 'Fri', 'Sat', 'Sun');
function group_days($in, $order) {
$out = array();
$outIndex = -1;
$prevIndex = -1;
foreach($in as $day) {
if($order[$day] - $prevIndex !== 1 || $outIndex === -1) {
$outIndex += 1;
$out[$outIndex] = array();
}
$prevIndex = $order[$day];
$out[$outIndex][] = $day;
}
return $out;
}
$groups = group_days($in, $order);
foreach($groups as $group) {
if(count($group) === 1) {
echo $group[0] . PHP_EOL;
}
else {
echo $group[0] . '-' . $group[count($group) -1] . PHP_EOL;
}
}