You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP数组中3字母月份转数字结果异常,求问题原因及解决

问题分析与解决

需求

将数组中每个字符串开头到空格前的3字母月份替换为对应数字月份。

用户编写的代码

初始匹配代码

$arr = [
    "May Hello",
    "Jun Hello12",
    "Jul 3"
];

$str =  $arr[0];
$matches = [];
$pattern = '/^\w+\s/';
preg_match_all($pattern, $str, $matches);

替换代码

$pattern = [
    '/^\w+\s/' => date('m', strtotime($matches[0][0])) . ' ', // first string until space
];
$arr = preg_replace(array_keys($pattern), array_values($pattern), $arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

执行后非预期结果

Array
(
    [0] => 05 7 Hello
    [1] => 05 Hello12
    [2] => 05 3
)

预期结果

Array
(
    [0] => 05 7 Hello
    [1] => 06 Hello12
    [2] => 07 3
)

代码错误点

  1. 仅匹配了第一个元素的月份:你只对数组第一个元素$arr[0]做了正则匹配,$matches里只有"May "的结果,后续替换时所有元素都用了这个固定的05,自然得不到各元素对应的月份。
  2. 替换值无法动态计算:preg_replace的替换值是预先计算好的静态字符串,没办法针对每个元素的匹配内容单独转换月份。

正确实现代码

改用preg_replace_callback,它支持对每个匹配结果动态处理:

$arr = [
    "May Hello",
    "Jun Hello12",
    "Jul 3"
];

$arr = preg_replace_callback(
    '/^(\w+)\s/', // 捕获开头的月份部分
    function($matches) {
        // 将捕获到的月份转为两位数字格式,保留后续空格
        return date('m', strtotime($matches[1])) . ' ';
    },
    $arr
);

echo '<pre>';
print_r($arr);
echo '</pre>';

代码说明

  • 正则/^(\w+)\s/用捕获组(\w+)提取出开头的月份字符串;
  • 回调函数针对每个匹配到的月份,用strtotime识别后,通过date('m')格式化为两位数字月份;
  • 遍历数组所有元素,逐个完成替换,最终得到符合预期的结果。

内容的提问来源于stack exchange,提问作者Cem Firat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:50:28