【发布时间】:2010-06-08 11:13:35
【问题描述】:
使用一组日期(企业的营业时间)。我想把它们压缩成最简洁的形式。
到目前为止,我是从这个结构开始的
Array
(
[Mon] => 12noon-2:45pm, 5:30pm-10:30pm
[Tue] => 12noon-2:45pm, 5:30pm-10:30pm
[Wed] => 12noon-2:45pm, 5:30pm-10:30pm
[Thu] => 12noon-2:45pm, 5:30pm-10:30pm
[Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Sat] => 12noon-11pm
[Sun] => 12noon-9:30pm
)
我想要实现的是:
Array
(
[Mon-Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Sat] => 12noon-11pm
[Sun] => 12noon-9:30pm
)
我已经尝试过编写一个递归函数,并且到目前为止已经成功地输出了这个:
Array
(
[Mon-Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Tue-Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Wed-Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Thu-Fri] => 12noon-2:45pm, 5:30pm-10:30pm
[Sat] => 12noon-11pm
[Sun] => 12noon-9:30pm
)
任何人都可以看到一种简单的方法来比较值并在它们相似的地方组合键吗?我的递归函数基本上是两个嵌套的foreach() 循环——不是很优雅。
谢谢, 马特
编辑:到目前为止,这是我的代码,它产生了上面的第三个数组(从第一个数组作为输入):
$last_time = array('t' => '', 'd' => ''); // blank array for looping
$i = 0;
foreach($final_times as $day=>$time) {
if($last_time['t'] != $time ) { // it's a new time
if($i != 0) { $print_times[] = $day . ' ' . $time; }
// only print if it's not the first, otherwise we get two mondays
} else { // this day has the same time as last time
$end_day = $day;
foreach($final_times as $day2=>$time2) {
if($time == $time2) {
$end_day = $day2;
}
}
$print_times[] = $last_time['d'] . '-' . $end_day . ' ' . $time;
}
$last_time = array('t' => $time, 'd' => $day);
$i++;
}
【问题讨论】:
-
您的问题定义不明确。程序是否应该知道星期二在星期一之后? “Mon-Tue, Fri”是一个有效的集合吗?折叠的具体规则是什么?你应该从那里开始,也许这样一个实现会变得更加明显。
-
你能告诉我们你目前使用的功能吗?
-
嗯,好点。它不必是智能的,它应该只是发现范围,例如:如果 Mon、Tue、Wed、Thu 和 Fri 都具有相同的值,那么它应该将第一个和最后一个键(Mon 和 Fri)连接在一起。虽然你是对的,但“Mon-Tue, Fri”也应该是有效的。我会再考虑一下...
-
Cetra:已编辑以包含我的(凌乱的)当前功能。