使用日期数组(业务开放时间)。我想把它们压缩成他们最简单的形式。PHP:将相似字符串数组精简为一个合并数组
到目前为止,我开始了这种结构
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++;
}
您的问题是不明确的。该节目是否应该知道星期二是在星期一之后? “周一至周五”是否为有效套餐?什么是折叠的规则?你应该从那里开始,然后实施将变得更加明显。 – Artefacto 2010-06-08 11:39:15
你能告诉我们你目前使用的功能吗? – Cetra 2010-06-08 11:42:27
嗯,好点。它不一定非常聪明,它应该发现范围,例如:如果星期一,星期二,星期三,星期四和星期五都具有相同的值,那么它应该将第一个和最后一个键(星期一和星期五)连接在一起。虽然你说得对,但“星期二,星期五”也应该是有效的。我会再想一想... – 2010-06-08 11:43:06