PHP in_array() 檢查元素

in_array() 函數用來檢查值是否存在於陣列中。

基本用法

<?php
$fruits = ['apple', 'banana', 'orange'];

if (in_array('banana', $fruits)) {
    echo "找到 banana";
}
?>

語法

in_array(mixed $needle, array $haystack, bool $strict = false): bool
  • $needle:要搜尋的值
  • $haystack:要搜尋的陣列
  • $strict:是否使用嚴格比較(===)
  • 回傳值:找到回傳 true,否則 false

嚴格模式

<?php
$arr = [1, 2, 3];

// 非嚴格模式(預設)
var_dump(in_array('1', $arr));        // true('1' == 1)
var_dump(in_array(true, $arr));       // true

// 嚴格模式
var_dump(in_array('1', $arr, true));  // false('1' !== 1)
var_dump(in_array(1, $arr, true));    // true
?>
建議使用嚴格模式(第三個參數設為 true),避免型別轉換造成的意外。

常見陷阱

<?php
$arr = [0, false, null, '', []];

// 非嚴格模式的陷阱
var_dump(in_array('hello', $arr));   // true!('hello' == 0)
var_dump(in_array('0', $arr));       // true
var_dump(in_array(0, $arr));         // true

// 嚴格模式
var_dump(in_array('hello', $arr, true));  // false
?>

搜尋關聯陣列的值

<?php
$person = [
    'name' => 'Alice',
    'age' => 25,
    'city' => 'Taipei'
];

// 搜尋值
if (in_array('Alice', $person)) {
    echo "找到 Alice";
}

// 搜尋鍵要用 array_key_exists
if (array_key_exists('name', $person)) {
    echo "有 name 這個鍵";
}
?>

常見應用

權限檢查

<?php
$userRoles = ['editor', 'writer'];
$allowedRoles = ['admin', 'editor'];

$hasPermission = !empty(array_intersect($userRoles, $allowedRoles));

// 或檢查特定角色
if (in_array('admin', $userRoles, true)) {
    echo "是管理員";
}
?>

驗證輸入

<?php
$validStatuses = ['pending', 'active', 'completed', 'cancelled'];

$status = $_POST['status'] ?? '';

if (!in_array($status, $validStatuses, true)) {
    echo "無效的狀態";
}
?>

白名單/黑名單

<?php
// 允許的副檔名
$allowedExtensions = ['jpg', 'png', 'gif', 'webp'];

$filename = 'image.jpg';
$ext = pathinfo($filename, PATHINFO_EXTENSION);

if (in_array(strtolower($ext), $allowedExtensions, true)) {
    echo "檔案類型允許";
}
?>

相關函數

array_search() - 取得鍵

<?php
$arr = ['apple', 'banana', 'orange'];

// in_array 只回傳布林
$exists = in_array('banana', $arr);  // true

// array_search 回傳鍵
$key = array_search('banana', $arr);  // 1
?>

array_key_exists() - 檢查鍵

<?php
$arr = ['a' => 1, 'b' => null];

// isset 對 null 值回傳 false
var_dump(isset($arr['b']));  // false

// array_key_exists 檢查鍵是否存在
var_dump(array_key_exists('b', $arr));  // true
?>

效能考量

<?php
// in_array 是 O(n) 操作
$large = range(1, 1000000);

// 對於頻繁查詢,使用 isset 更快(O(1))
$lookup = array_flip($large);
isset($lookup[999999]);  // 更快
?>