我们可以将数组问题转换为字符串问题,并使用正则表达式 (regex) 解决方案...它通过 finite automata 间接检查所有条件和案例。
PS:当我们的数组短,case 数量少时,这种算法构造是安全的,并且提供了完整的解决方案。
哦,是的,我们还可以将周数翻译成其他语言(参见 $lang 参数)!
多语言和正则表达式解决方案
function weekNumbers_toStr($days, $lang='en') {
$and = array('pt'=>'e', 'en'=>'and');
$strWeek = array( // config with more langs!
'pt'=>array("Segunda", "Terça", "Quarta", "Quinta", "Sexta",
"Sábado", "Domingo"),
'en'=> array("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
);
$days = array_unique($days);
sort($days);
$seq = preg_replace_callback( // Split sequence by ",":
'/0246|024|025|026|135|146|246|02|03|04|05|06|13|14|15|16|24|25|26|35|36|46/',
function ($m) { return join( ',' , str_split($m[0]) ); },
join('',$days)
);
// split two or more days by "-":
$seq = preg_replace('/(\d)\d*(\d)/', '$1-$2', $seq);
$a = explode(',',$seq);
$last = array_pop($a);
$n = count($a);
// Formating and translating:
$seq = $n? join(", ",$a): $last;
if ($last && $n) $seq = "$seq $and[$lang] $last";
return preg_replace_callback(
'/\d/',
function ($m) use (&$strWeek,$lang) {
return $strWeek[$lang][$m[0]];
},
$seq
);
} // func
测试:
print "\n".weekNumbers_toStr(array(6,1,2,3,6),'en'); // corrects order and dups
print "\n".weekNumbers_toStr(array(0,1,2,3,6)); // Monday-Thursday and Sunday
print "\n".weekNumbers_toStr(array(3,4,6),'pt'); // Quinta-Sexta e Domingo
print "\n".weekNumbers_toStr(array(3,4,6)); // Thursday-Friday and Sunday
print "\n".weekNumbers_toStr(array(2,3,4,6)); // Wednesday-Friday and Sunday
print "\n".weekNumbers_toStr(array(3,5)); // Thursday and Saturday
print "\n".weekNumbers_toStr(array(0,2,4,6)); // Monday, Wednesday, Friday and Sunday
print "\n".weekNumbers_toStr(array(0)); // Monday
print "\n".weekNumbers_toStr(array()); // (nothing)