上次在《PHP冒泡排序(Bubble Sort)算法詳解》一文中曾經提到過PHP交換兩個變量值的基礎方法,由於主要是談論冒泡排序的,因此沒有深究。那麼今天在這裏咱們就來看看,在PHP中,如何在不使用第三變量的狀況下,達到交換兩個變量值得目的。php
代碼:算法
<?php /** * 雙方變量爲字符串時,可用交換方法一 * 使用substr()結合strlen()兩個方法達到交換變量值得目的 */ $a = "This is A"; // a變量原始值 $b = "This is B"; // b變量原始值 echo '交換以前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出原始值 $a .= $b; // 將$b的值追加到$a中 /** * $b獲得$a值詳解: * 先經過strlen()分別計算出$a和$b中字符串的長度【此時$a是原始$a和$b的合值】 * 經過strlen($a)-strlen($b)便可得出原始$a的值長度 * 在經過substr()方法在合併後的$a中從0開始截取到$a的長度,那麼便可獲得原始$a的值 * $a獲得$b值詳解: * 因爲此刻$b已是$a的原始值了,而$a合併後的值爲原始$a+原始$b的值,故用substr()在$a中從$b(原始$a)長度位置截取,則去的內容則爲原始$b,則將$b值付給$a成功 */ $b = substr($a,0,(strlen($a)-strlen($b))); $a = substr($a, strlen($b)); echo '交換以後 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出結果值
運行結果:segmentfault
交換以前 $a 的值:This is A, $b 的值:This is B 交換以後 $a 的值:This is B, $b 的值:This is A
代碼:數組
<?php /** * 雙方變量爲字符串時,可用交換方法二 * 使用str_replace()方法達到交換變量值得目的 * 此方法較第一種,邏輯上稍微簡單點 */ $a = "This is A"; // a變量原始值 $b = "This is B"; // b變量原始值 echo '交換以前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出原始值 $a .= $b; // 將$b的值追加到$a中 $b = str_replace($b, "", $a); // 在$a(原始$a+$b)中,將$b替換爲空,則餘下的返回值爲$a $a = str_replace($b, "", $a); // 此時,$b爲原始$a值,則在$a(原始$a+$b)中將$b(原始$a)替換爲空,則餘下的返回值則爲原始$b,交換成功 echo '交換以後 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出結果值
運行結果:函數
交換以前 $a 的值:This is A, $b 的值:This is B 交換以後 $a 的值:This is B, $b 的值:This is A
代碼:code
<?php /** * 雙方變量爲字符串時,可用交換方法三 * 使用list()和array()方法達到交換變量值得目的 * 此方法較第1、二種,代碼最簡潔 */ $a = "This is A"; // a變量原始值 $b = "This is B"; // b變量原始值 echo '交換以前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出原始值 list($b,$a) = array($a,$b); // list() 函數用數組中的元素爲一組變量賦值。瞭解這個,相信其餘的不用我多說了吧 echo '交換以後 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出結果值
運行結果:排序
交換以前 $a 的值:This is A, $b 的值:This is B 交換以後 $a 的值:This is B, $b 的值:This is A
代碼:字符串
<?php /** * 雙方變量爲字符串或者數字時,可用交換方法四 * 使用異或運算 */ $a = "This is A"; // a變量原始值 $b = "This is B"; // b變量原始值 echo '交換以前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出原始值 /** * 原始二進制: * $a:010101000110100001101001011100110010000001101001011100110010000001000001 * $b:010101000110100001101001011100110010000001101001011100110010000001000010 * * 下面主要使用按位異或交換,具體請參照下列給出的二進制過程, */ $a=$a^$b; // 此刻$a:000000000000000000000000000000000000000000000000000000000000000000000011 $b=$b^$a; // 此刻$b:010101000110100001101001011100110010000001101001011100110010000001000001 $a=$a^$b; // 此刻$a:010101000110100001101001011100110010000001101001011100110010000001000010 echo '交換以後 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出結果值
運行結果:get
交換以前 $a 的值:This is A, $b 的值:This is B 交換以後 $a 的值:This is B, $b 的值:This is A
代碼:數學
<?php /** * 雙方變量爲數字時,可用交換方法五 * 使用加減運算符,至關於數學運算了^_^ */ $a = "This is A"; // a變量原始值 $b = "This is B"; // b變量原始值 echo '交換以前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出原始值 $a=$a+$b; // $a $b和值 $b=$a-$b; // 不解釋.. $a=$a-$b; // 不解釋.. echo '交換以後 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 輸出結果值
運行結果:
交換以前 $a 的值:1, $b 的值:2 交換以後 $a 的值:2, $b 的值:1
ok,以上差很少就是在php中不借助第三個變量交換兩個變量值的全部方法了,固然,確定還有更好地,我這裏算是拋磚引玉了。
說到底,都是小算法,你們有空本身也能夠研究下。