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]); // 更快
?>