php 交換2個變數,不使用第3個變數
阿新 • • 發佈:2020-08-21
首先說明,研究這個並不是想搞什麼演算法研究,目的在於能夠應用到日常的專案程式碼中。
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的方法,語句簡單,不用思考是不是同一個變數的問題。