1. 程式人生 > 實用技巧 >php 交換2個變數,不使用第3個變數

php 交換2個變數,不使用第3個變數

首先說明,研究這個並不是想搞什麼演算法研究,目的在於能夠應用到日常的專案程式碼中。

list

$a = 'A';
$b = 'B';

list($b, $a) = [$a, $b]; //php7可以簡寫為[$b, $a] = [$a, $b];

echo "a:{$a}, b:{$b}";

建議大家使用list($b, $a) = [$a, $b];的形式,相容性好,可讀性好。

異或

$a = 'A';
$b = 'B';

$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;

echo "a:{$a}, b:{$b}";

異或可以理解為是不進位的二進位制加法,位相同位0,不同為1,例如

00000101
00000110
------------
00000011

異或滿足交換律,即$a ^ $b和$b ^ $a是相同的。
從感性角度講,異或有點像我們玩的”消消樂“,相同的就”消掉“。比如一個數組[1,1,1,1,2,2,2,3,3],有一個元素出現奇數次,其它元素均出現偶數次,找出這個元素,可以這樣實現

$arr = [1,1,1,1,2,2,2,3,3];

$result = $arr[0];
for ($i=1;$i<count($arr);$i++) {
    $result ^= $arr[$i];
}

echo "結果為:{$result}"; // 2

防坑指南

用異或交換2個變數,要明確知道你要交換的2個變數不是同一個變數,比如你通過快慢指標的方式遍歷陣列,分別是i和j,你要交換$arr[$i]和$arr[$j],程式碼是這樣的

$arr[$i] = $arr[$i] ^ $arr[$j];
$arr[$j] = $arr[$i] ^ $arr[$j];
$arr[$i] = $arr[$i] ^ $arr[$j];

如果i != j沒問題,如果i == j,那麼說明$arr[$i]和$arr[$j]指向同一個變數,程式碼本質就變成了下面這樣

$a = 1;

$a = $a ^ $a;
$a = $a ^ $a;
$a = $a ^ $a;

你猜猜$a最後等於多少,答案是0。在上面第一次異或操作的時候$a變成0,0 ^ 0還是0。

小結

其實注意到異或也是因為研究演算法的時候碰到的,日常coding我們很少用到。但是我想研究了半天,平時不用一下感覺好浪費。不過針對本篇文章來說,我還是建議使用list的方法,語句簡單,不用思考是不是同一個變數的問題。