作为
我的这个答案的改编,使用查找数组和引用将连续的月份名称推入正确的元素中--使用
strtok()
和连接确保范围的结尾始终正确更新。
此片段的性能表现良好,因为它只使用一个循环,并且没有
in_array()
调用(PHP中最慢的搜索数组之一)。
代码:(
演示)
$lookup = array_flip(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
$months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Sep', 'Oct', 'Dec'];
$result = [];
foreach ($months as $month) {
if (isset($ref) && $lookup[$month] === $lookup[$last] + 1) {
$ref = strtok($ref, "-") . "-$month";
} else {
unset($ref);
$ref = $month;
$result[] = &$ref;
}
$last = $month;
}
var_export($result);
或者换一种方式,利用
$i
而不是
$last
,因为输入数组是有索引的。(
演示)
$result = [];
foreach ($months as $i => $month) {
if ($i && $lookup[$month] === $lookup[$months[$i - 1]] + 1) {
$ref = strtok($ref, "-") . "-$month";
} else {
unset($ref);
$ref = $month;
$result[] = &$ref;
}
}
var_export($result);
如果您的输入数组需要容纳循环引用,请使用模运算符与12(一年中的月份数)结合,以确保1月“回溯”到12月。(
演示)
if (isset($ref) && $lookup[$month] === ($lookup[$last] + 1) % 12) {