为什么在几个str_replace()函数中只有最后一个函数影响字符串?


Why out of several str_replace() functions only the last one affects the string?

我已经设置了一个非常简单的代码片段:

$string = 'Some random words. Some more random, very random words.';
$words = explode(" ", $string);
for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];
    $words[$i] = str_replace(".", "!", $word);
    $words[$i] = str_replace(",", "?", $word);
}
print_r($words);

输出如下:

Array
(
    [0] => Some
    [1] => random
    [2] => words.
    [3] => Some
    [4] => more
    [5] => random?
    [6] => very
    [7] => random
    [8] => words.
)

为什么只有第二个str_replace()函数影响字符串?如果我去掉第二个str_replace(),第一个就能正常工作。这不是关于str_replace()的使用,但我相信我做了一些非常非常简单的错误。

顺便说一下-我知道preg_replace()并将数组传递给str_replace(),但想听听这个特殊情况:)。

编辑:

感谢大家的快速回应。我为这样的问题感到羞愧,但它一开始并没有引起我的注意。谢谢大家!我接受Mike Brant的第一个正确答案

这是因为您的第二个语句使用$word作为替换的主题,而不是$words[$i],这是您在第一次替换后分配字符串的地方。

你可以通过直接使用$words[$i]来修复,或者只使用你的临时变量,然后像这样赋值:

for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];
    $word = str_replace(".", "!", $word);
    $words[$i] = str_replace(",", "?", $word);
}

因为您一遍又一遍地将str_replace应用于同一字符串。您需要重新分配新字符串(使用已替换的字符),并对更新后的值

执行另一次替换。
for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];  //initial value
    $word = str_replace(".", "!", $word);  //change $word to modified text
    $word = str_replace(",", "?", $word);  //change $word to modified text
    $words[$i] = $word;
}

$word的值没有被str_replace改变,所以它保持不变。要更改它,您需要分配来自str_replace

的返回值/结果

更改为:

for ($i = 0; $i < count($words); $i++) {        
    $words[$i] = str_replace(".", "!", $words[$i]);
    $words[$i] = str_replace(",", "?", $words[$i]);
}

更短:

for ($i = 0; $i < count($words); $i++) {        
    $words[$i] = str_replace(array(".", ","), array("!", "?"), $words[$i]);        
}