在PHP 中,數據過濾和驗證是處理用戶輸入時不可或缺的一部分。我們經常會用filter_var()來驗證單個數據值,但如果我們有一組數據,比如表單提交的多項字段,每個字段都需要不同的驗證規則,這時使用filter_var_array()就非常合適。
filter_var_array()是PHP 提供的一個函數,用於過濾多個數據值,通常是一個關聯數組,比如來自$_GET或$_POST的數據。這個函數可以根據你定義的過濾器規則,對每個字段分別進行處理。
函數原型如下:
filter_var_array(array $data, array|int $definition, bool $add_empty = true): array|false|null
$data :要處理的數組數據。
$definition :過濾規則,可以是一個整型(為所有字段使用同一個過濾器),也可以是一個數組(為不同字段定義不同過濾器)。
$add_empty :是否在結果中包含沒有匹配到的鍵,默認為true 。
假設你有一個用戶登錄表單,包含郵箱和年齡字段。你希望對郵箱進行驗證,對年齡進行整數驗證並限制範圍。使用filter_var_array()處理如下:
$data = [
'email' => '[email protected]',
'age' => '25'
];
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => [
'min_range' => 18,
'max_range' => 99
]
]
];
$result = filter_var_array($data, $filters);
print_r($result);
輸出可能是:
Array
(
[email] => [email protected]
[age] => 25
)
如果驗證失敗,相應的值會變成false 。
filter_var_array()特別適合處理表單數據,因為你可以定義清晰的驗證規則並批量處理。
$_POST = [
'username' => 'jack',
'email' => '[email protected]',
'age' => '17'
];
$rules = [
'username' => [
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_FLAG_NO_ENCODE_QUOTES
],
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 18]
]
];
$cleanData = filter_var_array($_POST, $rules);
print_r($cleanData);
在這個例子中,如果年齡小於18,返回的age就會是false ,提示我們驗證失敗。
你可以通過FILTER_DEFAULT和自定義選項來設置默認值,在缺少字段時也能得到有意義的輸出。
$data = [
'email' => 'wrong-format',
// 'age' => missing
];
$rules = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['default' => 18]
]
];
$result = filter_var_array($data, $rules);
print_r($result);
輸出:
Array
(
[email] => false
[age] => 18
)
當你接收第三方API 提交的數據時,使用filter_var_array()可以快速確保數據安全。
$json = file_get_contents('https://api.gitbox.net/user/input');
$input = json_decode($json, true);
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'subscription' => FILTER_VALIDATE_BOOLEAN
];
$validated = filter_var_array($input, $filters);
如果傳入的$data不是數組, filter_var_array()會返回false 。
如果某些鍵不在$definition中,但$add_empty設置為true ,它們仍會出現在返回結果中,值為null 。
需要小心使用FILTER_SANITIZE_*類型的過濾器,它們是清洗數據而不是驗證數據。
filter_var_array()是一個非常強大的工具,能夠幫助我們對一組數據進行批量驗證與清洗,代碼更加簡潔,也更具可維護性。在處理表單數據、API 請求或者任何需要多字段驗證的場景中,它都能大放異彩。
學會合理使用filter_var_array() ,你將能大幅提高PHP 項目中數據處理的安全性與效率。