對,就是標題下的這麼武斷,我個人除非寫那種用完即丟的小程式,通常我是會直接棄用in_array這個function的,這是個很極端的建議,但因為大多數情況我好像也沒感覺到什麼不便,就一直這麼做下去了,主要的原因是因為:他有點慢。
in_array其實用的就是linear search,他的時間複雜度是Big O(n),其實沒有到很差,但如果很不幸的是你的n非常大,又或者是你不小心把in_array放進另一個loop裡面跑,那他就會變成Big O(n^2),就相當糟了;再加上php大部分是用在網站的後端程式,如果你處理的站台日流量很大,其實就算你沒有放進loop裡面,也算是一個Big O(n^2)的概念,畢竟每一次存取你的頁面他都會跑一次linear search,這個節省下來仍然會是有一定效益的成本。
那麼怎麼解決?其實很簡單,就是改用Hash來處理,具體作法是這樣:
假設你有個array長這樣:
$array = [123, 3467, 12, 789, 22];
那麼你應該在一開始組建array的時候就讓它長這樣:
$array = [123 => 1, 3467 => 1, 12 => 1, 789 => 1, 22 => 1];
如此一來,你本來想要用in_array搜尋其中的一個數值,只要改成這樣就可以知道$number是不是在array裡面:
if ($array[$number])
return 'yes';
這樣子就會變成Big O(1),不管你的array有多少資料,他都可以快速得到結果,在處理資料量大的情況會非常有感的提升效能。
勿以省少而不為,這是我們後端工程師的明訓啊!