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

PHP in_array() 函數深度解析:陣列搜尋的正確姿勢

     編輯:PHP 綜合知識

函數簡介

in_array() 用於檢查指定值是否存在於陣列中,回傳布林值。語法如下:

bool in_array ( mixed $value, array $array [, bool $strict = FALSE ] )
  • $value:要搜尋的值
  • $array:目標陣列
  • $strict:true 為嚴格模式(型別與值皆需相同),false 為預設鬆散模式

核心示例與行為差異

1. 基本用法(鬆散比較)

$arr = [1, 3, 5, 7, 9];
var_dump(in_array(1, $arr));      // true
var_dump(in_array('1', $arr));    // true(字串 '1' 自動轉型為整數)

2. 嚴格模式(strict = true)

$arr = [1, 3, 5, 7, 9];
var_dump(in_array('1', $arr, true));  // false(型別不同:string vs int)
var_dump(in_array(1, $arr, true));    // true

3. 物件比較行為

class A { public $val = 1; }
class B { public $val = 2; }

$a = new A();
$b = new B();
$c = clone $a;  // 相同屬性值的獨立實例

$arr = [$a, $b];

var_dump(in_array($c, $arr, false)); // true(鬆散模式比較屬性值)
var_dump(in_array($c, $arr, true));  // false(嚴格模式比較物件實例身份)
關鍵差異:鬆散模式下比較物件屬性值;嚴格模式下比較是否為同一實例(===)。

4. 多維陣列搜尋(僅第一層)

$arr = [
    [1, 2, 3, 4],
    [5, 6, 7, 8, 9],
    10
];

var_dump(in_array(10, $arr));           // true(第三層元素)
var_dump(in_array(10, $arr[1]));        // false(第二層子陣列無 10)
var_dump(in_array([1,2,3,4], $arr));    // true(搜尋子陣列本身)

效能考量與替代方案

  • 大型陣列:in_array() 為線性搜尋 O(n),頻繁查詢建議改用 isset($arr[$value]) 或 array_flip() 後鍵值查找 O(1)
  • 多維深度搜尋:需自寫遞迴函數或使用 array_walk_recursive()
  • 嚴格模式預設:PHP 8.0+ 建議始終明確指定第三參數,避免非預期型別轉換

常見陷阱

// 陷阱 1:0、false、null 鬆散比較皆相等
in_array(0, ['apple', 'banana']);        // true('apple' == 0 為 true)
in_array(false, ['apple', 'banana']);    // true
in_array(null, ['apple', 'banana']);     // true

// 解決:務必使用嚴格模式
in_array(0, ['apple', 'banana'], true);  // false

// 陷阱 2:浮點數精度
in_array(0.1 + 0.2, [0.3]);              // false(0.30000000000000004)
in_array(round(0.1 + 0.2, 1), [0.3]);    // true
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved