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

PHP中preg_replace_callback的use子句变量异常问题排查与解决

preg_replace_callback回调变量异常问题的原因与修复

在使用preg_replace_callback的回调函数时出现异常:预期将字符串每个字符替换为递增序号,同时生成替换映射表,但实际每次回调中$i始终回到3,$map始终为空。

问题代码

$i = 2;
$map = [];
$token = preg_replace_callback(
  '~\w~',
  function($matches) use($map, $i) {
    $i += 1;
    $map[$i] = $matches[0];
    print "$i ";
    return $i;
  },
  '$token'
);
print_r($map);
print "\n$token";

实际输出

3 3 3 3 3 Array
(
)

$33333

问题原因

PHP中use关键字默认以值传递方式捕获外部变量,回调函数每次执行时都会创建$map和$i的独立副本,而非直接操作外部原始变量:

  • 每次回调时,副本$i的初始值都是外部的2,加1后固定为3;
  • 副本$map始终是空数组,修改后不会同步到外部的$map。

修复方案

将use中的变量改为引用传递,在变量前加&符号,让回调函数直接操作外部原始变量:

$i = 2;
$map = [];
$token = preg_replace_callback(
  '~\w~',
  function($matches) use(&$map, &$i) {
    $i += 1;
    $map[$i] = $matches[0];
    print "$i ";
    return $i;
  },
  '$token'
);
print_r($map);
print "\n$token";

预期输出

3 4 5 6 7 Array
(
    [3] => t
    [4] => o
    [5] => k
    [6] => e
    [7] => n
)

$34567

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:52:09