自動目錄
PHP的字串比對
很多初學者應該寫過這樣的程式碼吧:
$a ="abc123"; $b ="123def"; if( $a==$b) print "Same String" else print "Different String";
執行結果
Different String
看起來「結果」似乎沒錯,但是這不是正確的寫法,甚至有時出來錯誤的結果(而且常會找不到錯誤原因)。
字串比對應該要用 strcmp或是 strncmp,這樣子 $a和 $b 才會用「字串」的身分進行比對。來看以下的範例:
$a =123; $b ="123def"; if( $a==$b)print "{$a}=={$b}"; else print "{$a}!={$b}"; if( $a===$b)print "{$a}==={$b}"; else print "{$a}!=={$b}"; if(!strcmp($a,$b))print "{$a} eq {$b}"; else print "{$a} ne {$b}";
4、5、6行分別用不同的寫法來比對字串
執行結果
123==123def <==結果是相同
123!==123def
123 ne 123def
為什麼結果是相同的,因為如果用 '=='來判斷的話,字串 "123def" 會解析成數值 123。
好奇來執行10000次的比對,看看哪個方式比較快。
Use '==': 0.024129867553711
Use '===': 0.015527963638306
Use 'strcmp': 0.08548498153686
畫出時間比較發現,使用 === 竟然是最快的。
PHP中可用 '===' 代替 strcmp 更快速,因為 '===' 是會先比對變數型態。
重點是字串比對一定要用 strcmp 函式,不要使用 == 作邏輯比對。
三元運算子不一定慢
我都以為三元運算子是最慢的,其實不一定,寫個程式來測試:
$s = microtime(1); for ($i = 0; $i < 100000; $i++){ $a=1; if($a==1)$a=2; else $a=3; } $e = microtime(1); echo "IF Method: \$a={$a} ".($e - $s)."\n"; $s = microtime(1); for ($i = 0; $i < 100000; $i++){ $a=1; $a=($a==1)?2:3; } $e = microtime(1); echo "Ternary operator Method: \$a={$a} ".($e - $s)."\n";
輸出結果
IF Method: $a=2 0.02797794342041
Ternary operator Method: $a=2 0.02560019493103
三元運算子耗用的時間略小於if的判斷方法,因此
適當的使用三元運算子,不但簡潔而且不見得比較慢。
相關文章
原文 2010-06-04 00:56:08