我的项目有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时,我会获取数组的第一个元素,并且在开放日期间,我将获取数组的结束元素。 但在此期间,周四和周五关闭。 我需要的结果是
Mon-Wed, Sat - #some-time-here
Sun - #Some-time-here
我对如何处理这个问题非常困惑
答案 0 :(得分:1)
所以开放时间是独特的实体,而日子是每个实体的相关实体。这表示开放关闭时间是相关日期地图中的关键字的数据结构。 在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;
}
}