2019-07-04

有關 php 中 array_search() 會跳過陣列第一個元素 array[0] 的狀況

先說…這不是一個「問題 problem」,也不是一個「蟲 bug」,只是一個狀況。

再說…工作至今 (7/3) 滿一個月了…

ok

先舉個例子:

$a = array("a", "b", "c");
if(array_search("a", $a)) echo 'a 有存在 $a 中';
if(array_search("d", $a)) echo 'd 有存在 $a 中';
if(array_search("c", $a)) echo 'c 有存在 $a 中';

以印象,應該會在結果顯示「a 有存在 $a 中」跟「c 有存在 $c 中」才對吧?


但真正的結果是只出現「c 有存在 $a 中」

呃,為什麼?

去查了 php manual array_search 後才知道,它在 warning 有說明到,雖然 array_search 會在找不到時返回 boolean 的 false ,但有時會在「找到」而傳回的值雖然不是 boolean ,但確會被辨視為 false ,就如同上面的程式,因為找的是在陣列的第一個元素,也就是 0 ,而 0 被放在 if 時常會被視為 false…

所以在 php manual 有教說如果是要這樣辨視的話,最好是要用 === 或 !== 的方式來確認值跟型態。

一個 "=" ,是附值,也就是把等號右邊的放到左邊的變數存放。
兩個 "=" ,是做真假判斷,也就是「問」等號右邊的跟左邊的是不是相同,是返回 true ,反之返回 false
三個 "=" ,就是除了做兩個 "=" 的事之外,還會確認左右兩邊的「型態」是不是一樣
(!= 跟 !== 最前面多了個 ! 就是指 no equal to )

在兩個 "=" 的情況下,1 == true 、1 == '1'、'1' == 1、'1' == true 的結果都是會返回 true 的,這是因為在兩個 "=" 的情況下, php 會幫做型態轉換的比對(不過好像不僅是 php ,蠻多程式語言都會做這種轉換比對),而且當是在做數字型態跟文字型態的在比對時,文字型態會被型轉為數字型態來比,也就是當在做 1 == '1' , '1' 會做數字的型轉,所以等同在做 1 == 1,不過 1 == true 是哪個在做型轉?(我猜是 true )

而且,php 在做數字與文字的運算時,文字也會先轉數值型態再來被運算,如下


所以,回到 array_search() 的部份,依照 php manual 所提示的,要做到會印出「a 有存在 $a 中」跟「c 有存在 $c 中」的話,就如下

就加上判斷 array_search() return 回來的值的型態不是 boolean 的 false 的話就印出

沒有留言: