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)
?>