PHP array_search() 搜尋元素
array_search() 函數用來搜尋陣列中的值,並回傳對應的鍵。
基本用法
<?php
$arr = ['apple', 'banana', 'orange'];
$key = array_search('banana', $arr);
echo $key; // 1
?>
語法
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
$needle:要搜尋的值$haystack:要搜尋的陣列$strict:是否使用嚴格比較(===)- 回傳值:找到時回傳鍵,找不到回傳
false
注意回傳值
<?php
$arr = ['apple', 'banana', 'orange'];
// 錯誤的判斷方式
$key = array_search('apple', $arr);
if ($key) { // 0 會被當成 false
echo "找到了";
} else {
echo "找不到"; // 輸出:找不到(錯誤!)
}
// 正確的判斷方式
if ($key !== false) {
echo "找到了,索引是 $key"; // 找到了,索引是 0
}
?>
因為
array_search() 可能回傳 0,一定要用 !== false 來判斷,不能只用 if ($key)。嚴格模式
<?php
$arr = [0 => 'a', 1 => 'b', 2 => 0];
// 非嚴格模式(預設):使用 == 比較
echo array_search('0', $arr); // 2('0' == 0 是 true)
echo array_search(false, $arr); // 0(false == 'a' 某些情況下可能是 true)
// 嚴格模式:使用 === 比較
echo array_search('0', $arr, true); // false('0' !== 0)
echo array_search(0, $arr, true); // 2
?>
關聯陣列
<?php
$person = [
'name' => 'Alice',
'age' => 25,
'city' => 'Taipei'
];
$key = array_search('Alice', $person);
echo $key; // name
$key = array_search(25, $person);
echo $key; // age
?>
只回傳第一個匹配
<?php
$arr = ['apple', 'banana', 'apple', 'orange'];
$key = array_search('apple', $arr);
echo $key; // 0(只回傳第一個)
?>
找出所有匹配的鍵
<?php
$arr = ['apple', 'banana', 'apple', 'orange', 'apple'];
// 使用 array_keys
$keys = array_keys($arr, 'apple');
print_r($keys); // [0, 2, 4]
?>
常見應用
檢查值是否存在
<?php
$fruits = ['apple', 'banana', 'orange'];
// 使用 array_search
if (array_search('banana', $fruits) !== false) {
echo "找到 banana";
}
// 使用 in_array(只需要知道是否存在時更適合)
if (in_array('banana', $fruits)) {
echo "找到 banana";
}
?>
取得索引後操作
<?php
$items = ['a', 'b', 'c', 'd', 'e'];
$key = array_search('c', $items);
if ($key !== false) {
// 刪除元素
unset($items[$key]);
// 或修改元素
// $items[$key] = 'C';
}
print_r($items); // ['a', 'b', 'd', 'e']
?>
在物件陣列中搜尋
<?php
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie'],
];
// array_search 只能搜尋值,不能搜尋陣列內的屬性
// 需要使用 array_column 或自訂搜尋
// 方法 1:使用 array_column
$names = array_column($users, 'name');
$key = array_search('Bob', $names);
if ($key !== false) {
echo $users[$key]['id']; // 2
}
// 方法 2:使用 array_filter
$found = array_filter($users, fn($u) => $u['name'] === 'Bob');
$bob = reset($found);
echo $bob['id']; // 2
?>
反向查詢
<?php
$countryCode = [
'TW' => '台灣',
'US' => '美國',
'JP' => '日本'
];
// 用名稱找代碼
$code = array_search('日本', $countryCode);
echo $code; // JP
?>
相關函數
in_array() - 只檢查是否存在
<?php
$arr = ['apple', 'banana', 'orange'];
// 只需要知道是否存在
if (in_array('banana', $arr)) {
echo "存在";
}
// 嚴格模式
if (in_array('banana', $arr, true)) {
echo "存在(嚴格比較)";
}
?>
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
?>
array_keys() - 取得所有符合的鍵
<?php
$arr = [1, 2, 3, 2, 4, 2];
// 取得值為 2 的所有鍵
$keys = array_keys($arr, 2);
print_r($keys); // [1, 3, 5]
?>
效能考量
<?php
// array_search 是線性搜尋 O(n)
$arr = range(1, 1000000);
$start = microtime(true);
array_search(999999, $arr);
$time = microtime(true) - $start;
// 對於大量資料,考慮使用關聯陣列(雜湊表)
$lookup = array_flip(range(1, 1000000));
$start = microtime(true);
isset($lookup[999999]); // O(1)
$time2 = microtime(true) - $start;
// 雜湊查詢快很多
?>
注意事項
<?php
// 只回傳第一個匹配
$arr = [1, 2, 1, 3, 1];
echo array_search(1, $arr); // 0
// 型別比較
$arr = ['1', '2', '3'];
echo array_search(1, $arr); // 0(寬鬆比較)
echo array_search(1, $arr, true); // false(嚴格比較)
// 找不到時回傳 false
$arr = ['a', 'b', 'c'];
var_dump(array_search('d', $arr)); // bool(false)
?>