在不引入臨時變量的情況下交換兩個變量值,是經典算法面試題,也反映對語言特性的理解。本文介紹 5 種 PHP 實現方式,涵蓋字符串操作、數組解構、位運算、數學運算。
$a = "This is A"; $b = "This is B"; $a .= $b; // $a = "This is AThis is B" $b = substr($a, 0, strlen($a) - strlen($b)); // 截取原 $a 長度 $a = substr($a, strlen($b)); // 截取剩餘部分(原 $b)
原理:拼接後通過長度差定位分割點。限制:僅適用字符串,含多字節字符會錯誤。
$a = "This is A"; $b = "This is B"; $a .= $b; // 拼接 $b = str_replace($b, "", $a); // 從拼接串移除 $b → 得到原 $a $a = str_replace($b, "", $a); // 從拼接串移除原 $a → 得到原 $b
優點:邏輯直觀。缺點:若 $b 內容在 $a 中重複出現會誤替換,不通用。
$a = "This is A"; $b = "This is B"; list($b, $a) = array($a, $b); // 一行完成交換
優勢:
list($a, $b, $c) = [$b, $c, $a]$a = "This is A"; $b = "This is B"; $a = $a ^ $b; $b = $b ^ $a; // 此時 $b = 原 $a $a = $a ^ $b; // 此時 $a = 原 $b
數學原理:
x ^ y ^ y = xx ^ x ^ y = y適用:整數、字符串(按字節異或)。注意:PHP 字符串異或按字節操作,中文等多字節字符結果不可讀,但交換邏輯正確。
$a = 10; $b = 20; $a = $a + $b; // 30 $b = $a - $b; // 10 (原 $a) $a = $a - $b; // 20 (原 $b)
限制:
| 方法 | 適用類型 | 可讀性 | 性能 | 推薦場景 |
|---|---|---|---|---|
| substr/strlen | 純 ASCII 字符串 | 低 | 中 | 教學演示 |
| str_replace | 無重複子串字符串 | 中 | 中 | 特定場景 |
| list/array | 任意類型 | 高 | 高 | 通用首選 |
| 異或 | 整數/字節串 | 低 | 高 | 嵌入式/底層優化 |
| 加減法 | 數值 | 中 | 中 | 數學教學 |
// PHP 7.1+ 解構賦值語法糖 [$b, $a] = [$a, $b]; // 多變量循環移位 [$a, $b, $c] = [$b, $c, $a];
這是語法層面的原生支持,編譯器優化,無額外函數調用開銷,強烈推薦作為標準寫法。
雖然有 5 種花式交換法,但實際開發中 list($b, $a) = [$a, $b] 或 [$b, $a] = [$a, $b] 是唯一正解:類型無關、語義清晰、性能最優、易維護。其他方法僅作算法原理學習參考。