众所周知PHP中处理字符串替换的方式有很多,一般来说最常用的莫过于 str_replace ,使用方法可以查看手册上的例子,它接受三个参数,用来将 subject 中的 search 替换成 replace 。常规场景都是将这三个参数直接传入字符串进行处理,但其实手册上有说明这三个参数也可以传数组,我们来看看 search 和 replace 换成数组来传入会发生什么情况。

$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo str_replace($search, $replace, $subject);

理想状态下我们认为应该是 search 中的每个字符对应 replace 中的每个字符,所以结果应该是 BCDEF 。

但实际运行结果告诉我们,它的结果是 FFFFF ,为什么呢?我想应该是底层针对数组参数做了递归处理而导致。

这肯定不是我们想要的结果,那如何避免这种递归调用导致的层层替换呢?其实用 strtr 来处理就好了,手册上往下翻也能看到有用户写的详细的例子

function stro_replace($search, $replace, $subject)
{
    return strtr( $subject, array_combine($search, $replace) );
}

$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo stro_replace($search, $replace, $subject);

输出结果为 BCDEF ,跟我们预想的一样。然后使用 strtr 来处理字符串替换也可以避免用 str_replace 处理导致的很多问题,比如

$search = array(' ', '&');
$replace = array(' ', '&');
$subject = 'Hello & goodbye!';

// 我们想将空格替换成 $nbsp; 及 & 符号替换成 &
echo str_replace($search, $replace, $subject); // 结果:"Hello & goodbye!",明显不对

echo stro_replace($search, $replace, $subject); // 结果:"Hello & goodbye!",达到预期
$search = array('ERICA', 'AMERICA');
$replace = array('JON', 'PHP');
$subject = 'MIKE AND ERICA LIKE AMERICA';

// 我们想将 ERICA 替换成 JON,AMERICA 替换成 PHP
echo str_replace($search, $replace, $subject); // 结果:"MIKE AND JON LIKE AMJON",这不是我们想要的

echo stro_replace($search, $replace, $subject); // 结果:"MIKE AND JON LIKE PHP",没错就是这样