mixed str_replace ( mixed $search, mixed $replace, mixed $subject [, int &$count ] )
三個核心參數 $search、$replace、$subject 均接受字符串或陣列,組合出 2³=8 種情況(含純字符串)。本文深度測試五種典型陣列組合場景。
str_replace("m", "n", "my name is jim!");
// 返回:"ny nane is jin!"
str_replace(['m', 'i'], 'n', "my name is jim!");
// 返回:"ny nane ns jnn!"
規則:依次用同一個 $replace 替換 $search 中每個元素。順序執行,先替換 'm' 再替換 'i'。
str_replace('m', ['n', 'z'], "my name is jim!");
// 返回:"Arrayname is jiArray!"
關鍵發現:當 $replace 為陣列但 $search 為字符串時,PHP 將整個陣列轉為字符串 "Array" 進行替換!此行為幾無實用價值,極易產生 Bug。
str_replace("m", "n", ["my name is jim!", "the game is over!"]);
// 返回:["ny nane is jin!", "the game is over!"]
規則:對陣列中每個字符串獨立執行替換,返回結果陣列。結構保持一致。
// 等長陣列:一一對應替換
str_replace(['m', 'i'], ['n', 'z'], "my name is jim!");
// 返回:"ny nane zs jzn!"
// $search 較長:多出元素替換為空字符串
str_replace(['m', 'i', 's'], ['n', 'z'], "my name is jim!");
// 返回:"ny nane z jzn!" ('s' 被替換為 '')
// $replace 較長:多出元素被忽略
str_replace(['m', 'i'], ['n', 'z', 'x'], "my name is jim!");
// 返回:"ny nane zs jzn!" ('x' 無效)
核心規則:按索引一一對應。$search 多 → 空字符串填補;$replace 多 → 忽略。
str_replace(
['m', 'i'],
['n', 'z'],
["my name is jim!", "the game is over"]
);
// 返回:["ny nane zs jzn!", "the gane zs over"]
規則:對 $subject 每個元素,應用相同的 $search→$replace 映射規則。
| 場景 | $search | $replace | $subject | 返回類型 | 關鍵行為 |
|---|---|---|---|---|---|
| 基準 | 字符串 | 字符串 | 字符串 | 字符串 | 全局替換 |
| 1 | 陣列 | 字符串 | 字符串 | 字符串 | 同一替換值應用於所有搜索值 |
| 2 | 字符串 | 陣列 | 字符串 | 字符串 | 陣列轉 "Array" 字符串(陷阱) |
| 3 | 字符串 | 字符串 | 陣列 | 陣列 | 逐元素獨立替換 |
| 4 | 陣列 | 陣列 | 字符串 | 字符串 | 索引對應;長度不等按規則填補/忽略 |
| 5 | 陣列 | 陣列 | 陣列 | 陣列 | 對 subject 每元素應用同一映射 |
$map = ['m' => 'n', 'i' => 'z', 's' => '$'];
$str = "my name is jim!";
foreach ($map as $k => $v) {
$str = str_replace($k, $v, $str);
}
// 結果可控、邏輯清晰
strtr():單字符映射更快,且無順序依賴問題str_replace($s, $r, $subj, $count)str_replace 陣列參數行為看似靈活,實則暗藏陷阱(特別是場景 2)。生產代碼中,顯式循環 + 關聯映射 比依賴內置陣列語義更安全、更易維護、更易調試。