首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 依指定值刪除陣列元素:array_search() + unset() 實務技巧

     編輯:PHP 相關知識

核心技巧:搜尋鍵名 → 刪除元素

<?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()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved