
本文介绍一种简洁高效的方法:利用 array_map() 结合 strtotime() 和 date('n'),将按“M y”格式排列的日期字符串数组,映射为对应月份键值的数值数组,确保结果严格遵循原始日期顺序。
本文介绍一种简洁高效的方法:利用 `array_map()` 结合 `strtotime()` 和 `date('n')`,将按“m y”格式排列的日期字符串数组,映射为对应月份键值的数值数组,确保结果严格遵循原始日期顺序。
在实际开发中(如财务预测、销售报表等场景),我们常需将结构松散但语义明确的日期标签(如 "May 22")与按标准数字月份(1–12)索引的数据进行对齐重组。核心挑战在于:不依赖硬编码映射表,动态解析英文缩写月份并转换为对应数字键,再安全地从源数据数组中提取值。
以下为推荐实现方案(PHP 7.4+):
$forecastedMonths = [
"May 22", "Jun 22", "Jul 22", "Aug 22", "Sep 22", "Oct 22",
"Nov 22", "Dec 22", "Jan 23", "Feb 23", "Mar 23", "Apr 23"
];
$data = [
1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 172427.89, 6 => 0,
7 => 243730.79, 8 => 0, 9 => 0, 10 => 0, 11 => 0, 12 => 0
];
$result = array_map(function($monthStr) use ($data) {
$monthNum = (int) date('n', strtotime($monthStr));
return $data[$monthNum] ?? 0; // 使用空合并操作符防御缺失键
}, $forecastedMonths);
var_export($result);✅ 输出结果完全匹配预期:
array ( 0 => 172427.89, 1 => 0, 2 => 243730.79, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0, 11 => 0, )
关键要点说明:
-
strtotime($monthStr)能可靠解析"May 22"等格式(自动补全年份,默认为当前年,但仅需月份信息,故无影响); -
date('n', ...)返回无前导零的月份数字(1–12),完美对应$data的键; - 使用
$data[$monthNum] ?? 0替代直接下标访问,避免因解析异常或数据缺失导致Notice: Undefined index; - 整个过程无需循环索引、无需
foreach手动构建,语义清晰且函数式风格利于复用与测试。
⚠️ 注意:确保服务器时区设置合理(如
date_default_timezone_set('UTC')),避免因本地时区导致strtotime()解析跨年月份(如"Jan 23")出现偏差。若需更高鲁棒性,可预校验$monthStr格式或使用DateTimeImmutable显式构造。

















