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

PHP array_filter() 過濾陣列空值完整指南:多維陣列、自訂回調、鍵名保留

     編輯:PHP 相關知識

array_filter() 是 PHP 過濾陣列元素的核心函數,透過回調函數決定保留哪些元素。**預設移除所有「虛偽值」 (false, 0, "", null, [], 等)**,並**保留關聯鍵名**。本文詳細說明基本用法、多維陣列遞迴過濾、自訂條件、鍵名/鍵值過濾進階技巧。

基本語法

array_filter(array $array, callable $callback = null, int $flag = 0): array
  • $callback:回傳 true 保留,false 移除。省略時使用預設規則(移除虛偽值)。
  • $flag:
    • ARRAY_FILTER_USE_KEY:回調只接收 key。
    • ARRAY_FILTER_USE_BOTH:回調接收 (value, key)。

預設行為:移除虛偽值

<?php
$array = [
    0 => '霜天部落',
    1 => false,
    2 => 1,
    3 => null,
    4 => '',
    5 => 'https://www.hzhuti.com',
    6 => '0', // 字串 "0" 也是虛偽值!
];

$result = array_filter($array);
print_r($result);
/*
Array
(
    [0] => 霜天部落
    [2] => 1
    [5] => https://www.hzhuti.com
)
*/
// 注意:鍵名 0, 2, 5 保留原狀
?>

自訂回調:精確控制保留條件

<?php
// 只保留非空字串且非 "php" 的值
function customFilter($value) {
    return $value !== '' && $value !== 'php';
}

$a = ['pig', 'Cat', '', 'php'];
print_r(array_filter($a, 'customFilter'));
/*
Array
(
    [0] => pig
    [1] => Cat
)
*/

// 匿名函數 (PHP 5.3+)
$filtered = array_filter($a, fn($v) => $v !== '' && $v !== 'php');
?>

進階:依鍵名過濾 (ARRAY_FILTER_USE_KEY)

<?php
$data = [
    'id' => 1,
    'name' => 'John',
    'password' => 'secret',
    'email' => 'john@example.com',
    '_token' => 'csrf_token',
];

// 只保留不以下劃線開頭的鍵
$public = array_filter($data, fn($key) => $key[0] !== '_', ARRAY_FILTER_USE_KEY);
/*
[
    'id' => 1,
    'name' => 'John',
    'password' => 'secret', // 注意:鍵名過濾不看值
    'email' => 'john@example.com',
]
*/
?>

進階:同時依鍵值決定 (ARRAY_FILTER_USE_BOTH)

<?php
$users = [
    1 => ['name' => 'Alice', 'active' => true],
    2 => ['name' => 'Bob', 'active' => false],
    3 => ['name' => 'Charlie', 'active' => true],
];

// 保留 active=true 且 id>1 的用戶
$filtered = array_filter($users, function($user, $id) {
    return $user['active'] && $id > 1;
}, ARRAY_FILTER_USE_BOTH);
/*
[
    3 => ['name' => 'Charlie', 'active' => true]
]
*/
?>

多維陣列遞迴過濾

array_filter() **不會遞迴**進入子陣列。需自行實作:

<?php
function array_filter_recursive(array $array, callable $callback): array {
    $result = [];
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $filtered = array_filter_recursive($value, $callback);
            if (!empty($filtered)) { // 子陣列非空才保留
                $result[$key] = $filtered;
            }
        } elseif ($callback($value, $key)) {
            $result[$key] = $value;
        }
    }
    return $result;
}

// 測試
$data = [
    'a' => 1,
    'b' => '',
    'c' => [
        'd' => 2,
        'e' => null,
        'f' => [
            'g' => 3,
            'h' => ''
        ]
    ]
];

$clean = array_filter_recursive($data, fn($v) => $v !== '' && $v !== null);
/*
[
    'a' => 1,
    'c' => [
        'd' => 2,
        'f' => ['g' => 3]
    ]
]
*/
?>

常見陷阱

  • 字串 "0" 被視為虛偽值:預設回調會移除 '0'。若要保留,必須自訂回調 fn($v) => $v !== '' && $v !== null && $v !== false。
  • 鍵名重置:array_filter() **保留關聯鍵**,但**數字鍵會重新索引 (0,1,2...)**。若需保留數字鍵,需先轉關聯鍵或用 array_values() 後再處理。
  • 回調嚴格比較:建議用 ===/!== 避免型別轉換驚喜。
  • 大陣列效能:遞迴過濾深層大陣列可能耗盡記憶體/堆疊,考慮迭代器模式。

實戰:清理表單輸入

<?php
function cleanInput(array $input): array {
    return array_filter($input, function($value, $key) {
        // 移除空字串、純空白、特定標記
        if (is_string($value)) {
            $trimmed = trim($value);
            if ($trimmed === '' || $trimmed === 'N/A') return false;
        }
        // 移除內部欄位
        if (str_starts_with($key, '_')) return false;
        return true;
    }, ARRAY_FILTER_USE_BOTH);
}

$_POST = cleanInput($_POST);
// 後續處理乾淨的 $_POST
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved