首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 不用第三變量交換兩個值的 5 種經典算法

     編輯:PHP 綜合知識

前言

在不引入臨時變量的情況下交換兩個變量值,是經典算法面試題,也反映對語言特性的理解。本文介紹 5 種 PHP 實現方式,涵蓋字符串操作、數組解構、位運算、數學運算。

方法一:substr + strlen 字符串拼接截取

$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)

原理:拼接後通過長度差定位分割點。限制:僅適用字符串,含多字節字符會錯誤。

方法二:str_replace 替換法

$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 中重複出現會誤替換,不通用。

方法三:list() + array() 解構賦值(推薦)

$a = "This is A";
$b = "This is B";

list($b, $a) = array($a, $b); // 一行完成交換

優勢:

  • 語法清晰,語義明確
  • 支持任意類型(字符串、數字、對象、數組)
  • PHP 內部優化,性能最佳
  • 可擴展到多變量輪換: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 = x
  • x ^ x ^ y = y

適用:整數、字符串(按字節異或)。注意:PHP 字符串異或按字節操作,中文等多字節字符結果不可讀,但交換邏輯正確。

方法五:加減運算(數學基礎)

$a = 10;
$b = 20;

$a = $a + $b; // 30
$b = $a - $b; // 10 (原 $a)
$a = $a - $b; // 20 (原 $b)

限制:

  • 僅適用數值類型
  • 可能溢出(PHP 整數溢出自動轉浮點,精度可能損失)
  • 浮點數精度問題(0.1+0.2≠0.3)

性能與適用性對比

方法適用類型可讀性性能推薦場景
substr/strlen純 ASCII 字符串低中教學演示
str_replace無重複子串字符串中中特定場景
list/array任意類型高高通用首選
異或整數/字節串低高嵌入式/底層優化
加減法數值中中數學教學

現代 PHP 最佳實踐

// PHP 7.1+ 解構賦值語法糖
[$b, $a] = [$a, $b];

// 多變量循環移位
[$a, $b, $c] = [$b, $c, $a];

這是語法層面的原生支持,編譯器優化,無額外函數調用開銷,強烈推薦作為標準寫法。

總結

雖然有 5 種花式交換法,但實際開發中 list($b, $a) = [$a, $b] 或 [$b, $a] = [$a, $b] 是唯一正解:類型無關、語義清晰、性能最優、易維護。其他方法僅作算法原理學習參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved