2013-01-16 15 views
0

我已經建立了一個非常簡單的代碼片段:爲什麼在幾個str_replace()函數中只有最後一個影響字符串?

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

回答

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); 
} 
+0

哦,我笨! –

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

+1謝謝。我注意到我知道數組參數,但仍然 - 很好的例子:)。 –

+0

每一個新的線路或變量意味着更多的內存到服務器......導致更高的功耗和更少的可能交通..因此拯救地球;) – bitWorking

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

相關問題