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

PHP 陣列刪除空值/指定值完整指南:array_filter、array_diff 與遞迴深度清理

     編輯:PHP 相關知識

常見誤區分析

  • empty($arr):陣列含空字串 ["", "", ""] 仍回傳 false(非空)。
  • count($arr):同上,計算元素個數非內容是否為空。
  • in_array('', $arr):僅檢測「是否存在空值」,無法判定整個陣列是否全空。
  • implode():二維陣列 [[], [], []] 會產生 ",," 導致誤判為非空。

一維陣列:刪除空值/指定值標準做法

$arr = ['a', '', 'b', null, 0, false, 'c', ''];

// 1. 刪除所有「空值」(''、null、false、0、'0'、[])
$filtered = array_filter($arr); 
// 結果:['a', 'b', 'c']  — 0 和 false 也被移除

// 2. 僅刪除空字串,保留 0/false
$filtered = array_filter($arr, function($v) { return $v !== ''; });
// 結果:['a', 'b', null, 0, false, 'c']

// 3. 刪除指定值(如 'b')
$filtered = array_diff($arr, ['b', '']);
// 結果:['a', null, 0, false, 'c'] — 保留鍵名不重排

// 4. 刪除指定值並重排索引
$filtered = array_values(array_diff($arr, ['b', '']));
// 結果:['a', null, 0, false, 'c'] (索引 0..4)

多維陣列:遞迴深度清理

function array_clean_recursive(array $array, callable $callback = null): array {
    $callback ??= fn($v) => $v !== '' && $v !== null; // 預設刪除空字串與 null
    
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            $value = array_clean_recursive($value, $callback);
            // 可選:清理後若子陣列為空,一併移除
            if (empty($value)) {
                unset($array[$key]);
            }
        } elseif (!$callback($value)) {
            unset($array[$key]);
        }
    }
    return $array;
}

// 使用範例
$data = [
    'users' => [
        ['name' => 'Tom', 'email' => ''],
        ['name' => '', 'email' => 'jerry@example.com'],
        ['name' => '', 'email' => ''],
    ],
    'meta' => ['source' => '', 'tags' => []]
];

$clean = array_clean_recursive($data);
// 結果:users 保留前兩筆(第三筆全空被移除),meta 保留 tags 空陣列(未觸發移除條件)

鍵名操作:依鍵名刪除

$arr = ['id' => 1, 'name' => 'Tom', 'password' => 'secret', 'token' => 'abc'];

// 刪除敏感鍵
unset($arr['password'], $arr['token']);
// 或
$safe = array_diff_key($arr, array_flip(['password', 'token']));

效能與記憶體提示

  • array_filter() 會保留原鍵名,大陣列建議搭配 array_values() 重排或直接 foreach 就地修改(引用 &$v)。
  • 遞迴函式注意深度限制(PHP 預設無限制,但極深陣列可能堆疊溢位),超大資料考慮迭代器模式。

掌握 array_filter、array_diff、遞迴清理三大核心工具,靈活應對各類陣列淨化需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved