核心技巧:搜尋鍵名 → 刪除元素
<?php
$animals = ["a" => "Dog", "b" => "Cat", "c" => "Horse"];
echo "刪除前:<br>";
print_r($animals);
// 1. 找到值對應的鍵名
$key = array_search("Cat", $animals); // 回傳 "b"
// 2. 存在則刪除
if ($key !== false) {
unset($animals[$key]);
}
echo "<br>刪除後:<br>";
print_r($animals);
/*
Array
(
[a] => Dog
[c] => Horse
)
鍵名 'b' 被移除,其他鍵名保持不變
*/
?>
array_search() 詳細說明
語法
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
$needle:搜尋的值
$haystack:目標陣列
$strict:true 時嚴格比較 (型別也需相同,即 ===)
回傳值
- 找到:回傳**第一個**符合的**鍵名** (int 或 string)
- 找不到:回傳
false
- 陷阱:鍵名可能為
0 或 "",**必須用 === false 判斷**
進階場景
1. 刪除所有符合值的元素 (非僅第一個)
<?php
$data = [10, 20, 30, 20, 40, 20];
$valueToRemove = 20;
// 方法一:迴圈 + array_search (注意陣列變動)
while (($key = array_search($valueToRemove, $data)) !== false) {
unset($data[$key]);
}
// 結果:[10, 30, 40] (鍵名保留 0,2,4)
// 方法二:array_filter (推薦,語意清晰、自動重新索引若需)
$data = array_values(array_filter($data, fn($v) => $v !== $valueToRemove));
// 結果:[10, 30, 40] (鍵名重新 0,1,2)
?>
2. 多維陣列:依特定欄位值刪除整筆資料
<?php
$users = [
['id' => 1, 'name' => 'Alice', 'role' => 'admin'],
['id' => 2, 'name' => 'Bob', 'role' => 'user'],
['id' => 3, 'name' => 'Charlie', 'role' => 'admin'],
];
// 刪除 role 為 admin 的使用者
$users = array_filter($users, fn($u) => $u['role'] !== 'admin');
// 結果:保留 Bob
print_r($users);
?>
3. 保留鍵名 vs 重新索引
| 方法 | 鍵名保留 | 適用情境 |
unset($arr[$key]) | ✅ 保留 | 鍵名有業務意義 (如 ID、代碼) |
array_splice($arr, $key, 1) | ❌ 數字鍵重新索引,字串鍵保留 | 需連續數字索引 |
array_filter() | ✅ 保留 (PHP 8.1+ 可用 ARRAY_FILTER_USE_KEY 控制) | 條件式過濾,語意最清晰 |
array_values() | ❌ 強制重新索引 0..n | 輸出 JSON 陣列、需連續索引 |
常見錯誤
<?php
$arr = ['a', 'b', 'c'];
$key = array_search('a', $arr); // 0
if (!$key) { // 錯誤!0 為 false,導致不執行刪除
unset($arr[$key]);
}
// 正確寫法
if ($key !== false) {
unset($arr[$key]);
}
?>
總結
- 單一值刪除:
array_search() + unset() (記得 === false)。
- 多重值/條件刪除:
array_filter() 更簡潔、可讀、安全。
- 多維陣列:直接
array_filter() 判斷子陣列欄位。
- 需重新索引:最後包一層
array_values()。