萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP in_array 嚴格模式陷阱與最佳實務:型別比較、效能、替代方案

經典陷阱:鬆散比較行為

<?php
var_dump(in_array(0, ['a', 'b']));        // true (!)
var_dump(in_array('0', ['a', 'b']));      // false
var_dump(in_array(null, ['a', 'b']));     // false
var_dump(in_array(false, ['a', 'b']));    // true (!)
var_dump(in_array('', ['a', 'b']));       // false

// 原因:'a' == 0 為 true(字串轉數字 = 0)

嚴格模式(第 3 參數 true)

<?php
var_dump(in_array(0, ['a', 'b'], true));     // false ✓
var_dump(in_array('0', ['0', '1'], true));   // true
var_dump(in_array(123, ['123'], true));      // false (int vs string)
var_dump(in_array(123, [123], true));        // true

效能分析

  • in_array:O(n) 線性搜尋,每次比較需型別轉換(非嚴格模式)
  • 大陣列(>1000 元素)頻繁查找 → 改用 array_flip + isset O(1)

高效能替代方案

<?php
$large = range(1, 100000);
$lookup = array_flip($large); // 鍵值互換

// O(1) 查找
isset($lookup[50000]); // true
isset($lookup[999999]); // false

// 保留原值關聯
$map = ['a' => 1, 'b' => 2];
isset($map['a']); // true

多維陣列/物件查找

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
];

// 錯誤:in_array 只比較第一層
// in_array(['id' => 1], $users); // false

// 正確:array_column + in_array
$ids = array_column($users, 'id');
in_array(1, $ids); // true

// 或用 array_search 取得鍵
$key = array_search(1, $ids); // 0

最佳實務建議

場景推薦做法
小陣列(<50)、簡單值in_array($val, $arr, true) 嚴格模式
大陣列、頻繁查找array_flip + isset 或 array_column 建立索引
關聯陣列找鍵array_key_exists / isset
物件集合找屬性array_column / 迴圈 / Collection 庫
需自訂比較邏輯array_filter + 閉包

相關函式

  • array_search($needle, $haystack, true):回傳鍵名,找不到 false
  • array_keys($arr, $val, true):回傳所有匹配的鍵
  • array_key_exists($key, $arr):檢查鍵是否存在(含 null 值)

原始來源:www.111cn.net

copyright © 萬盛學電腦網 all rights reserved