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

时间:2013-01-16 16:48:42

标签: php

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

$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 的第一个正确答案。

3 个答案:

答案 0 :(得分:4)

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

您可以通过直接使用$words[$i]整个时间进行修复,或者专门使用您的临时变量进行修复,然后进行如此分配:

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

答案 1 :(得分:2)

因为您一遍又一遍地将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更改,因此它保持不变。要更改它,您需要从{{1}}

指定返回值/结果

答案 2 :(得分:1)

更改为:

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]);        
}