首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP in_array() 函數完整指南:參數、嚴格模式與效能陷阱

     編輯:PHP 相關知識

函數簽名

in_array(mixed $needle, array $haystack, bool $strict = false): bool

基本用法

$os = ['Mac', 'NT', 'Irix', 'Linux'];
var_dump(in_array('Irix', $os));        // true
var_dump(in_array('mac', $os));         // false(大小寫敏感)

嚴格模式(第 3 參數 true)

同時比較值與型別:

$a = ['1.10', 12.4, 1.13];
var_dump(in_array('12.4', $a, true)); // false(字串 vs 整數/浮點數)
var_dump(in_array(1.13, $a, true));   // true(同為 float)

多維陣列搜尋

$a = [['p', 'h'], ['p', 'r'], 'o'];
var_dump(in_array(['p', 'h'], $a)); // true(陣列比較遞迴檢查)

效能陷阱與替代方案

場景in_array 效能推薦替代複雜度
陣列 < 50 元素可接受in_arrayO(n)
陣列 > 1000 元素,頻繁查詢慢(每次遍歷)isset($map[$key])O(1)
需檢查多個值是否存在多次遍歷array_intersectO(n)

優化範例:建立查找表

$largeArray = range(1, 100000);
$needles = [123, 456, 789];

// 慢:每次 O(n)
foreach ($needles as $n) {
    in_array($n, $largeArray);
}

// 快:預先建立 hash map O(n),查詢 O(1)
$map = array_flip($largeArray); // [1=>0, 2=>1, ...]
foreach ($needles as $n) {
    isset($map[$n]); // 極快
}

常見坑點

浮點數精度導致嚴格模式失效
in_array(0.1 + 0.2, [0.3], true) 為 false(0.30000000000000004)。解決:比較前 round() 或用字串比較。
大型陣列重複搜尋
若在迴圈中對同一陣列反覆 in_array,務必先 array_flip 或 array_column 建立索引。
物件比較
嚴格模式下,物件比較需為同一實例(===),不同實例即使屬性相同也回傳 false。

PHP 8.1+ 新功能:array_is_list()

$arr = [1, 2, 3];
array_is_list($arr); // true
$arr2 = [0=>1, 2=>3]; // 非連續鍵
array_is_list($arr2); // false

配合 in_array 可先判斷陣列類型選擇最佳搜尋策略。

總結

  • 小陣列、單次查詢:直接 in_array。
  • 大陣列、高頻查詢:預先建立 Hash Map(array_flip)。
  • 型別敏感場景:永遠啟用 $strict = true,避免隱性型別轉換 Bug。
  • 多維陣列搜尋:in_array 支援遞迴比較,但效能差,建議正規化資料結構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved