前言
最近优化项目的时候,整理到了请求参数的处理类,针对有效参数的接收和过滤,正好用到的array_filter作为数组元素校验和过滤,简单记录下
array_filter($array, $callback = null, $mode = 0)
使用回调函数过滤数组的元素。遍历 array
数组中的每个值,并将每个值传递给 callback
回调函数。 如果 callback 回调函数返回 true
,则将 array
数组中的当前值返回到结果 array
数组中。
$callback
: 回调函数,不设置的话,过滤数组内所有空元素。如何判定“空”元素,请参照empty()
$mode
: 决定哪些参数发送到 callback 回调。默认0,传值给回调函数
- ARRAY_FILTER_USE_KEY - 将键名作为 callback 回调的唯一参数
- ARRAY_FILTER_USE_BOTH - 将值和键都作为参数传递给 callback 回调
示例
$arr = ['', "", null, [], FALSE, NULL, '0', 0, "robin", 3];
//默认过滤
var_dump(array_filter($arr));
/**
array(2) {
[8]=>string(5) "robin"
[9]=>int(3)
}
*/
//回调函数传值过滤
function callback_val($val) {
if(is_null($val) || $val === 0) {
return false;
}
return true;
}
var_dump(array_filter($arr, "callback_val"));
/**
array(7) {
[0]=>string(0) ""
[1]=>string(0) ""
[3]=>array(0) {}
[4]=>bool(false)
[6]=>string(1) "0"
[8]=>string(5) "robin"
[9]=>int(3)
}
*/
//回调函数传键过滤
function callback_use_key($key) {
if($key <= 5) {
return false;
}
return true;
}
var_dump(array_filter($arr, "callback_use_key", ARRAY_FILTER_USE_KEY));
/**
array(4) {
[6]=>string(1) "0"
[7]=>int(0)
[8]=>string(5) "robin"
[9]=>int(3)
}
*/
//回调函数传键&值过滤
function callback_use_both($val, $key) {
if($key <= 5 || $val == 3) {
return false;
}
return true;
}
var_dump(array_filter($arr, "callback_use_both", ARRAY_FILTER_USE_BOTH));
/**
array(3) {
[6]=>string(1) "0"
[7]=>int(0)
[8]=>string(5) "robin"
}
*/
静态类/实例化场景
上面主要示例了一些函数直接调用的方法,实际项目场景中,基本是以静态类、静态方法或实例化的调用方式
<?php
class Request {
private static $_arr = ['', "", null, [], FALSE, NULL, '0', 0, "robin", 3];
/**
* 回调函数接收:键&值
*/
private static function callback_val_key($val, $key) {
if($key <= 5 || $val == 3) {
return false;
}
return true;
}
/**
* 键&值过滤
*/
public static function filter_use_both() {
return array_filter(self::$_arr, [self, "callback_val_key"], ARRAY_FILTER_USE_BOTH);
}
/**
* 回调函数接收:值
*/
public static function callback_check($val) {
if(is_null($val) || $val === 0) {
return false;
}
return true;
}
/**
* 默认传值过滤
*/
public static function filter() {
return array_filter(self::$_arr, [self, "callback_check"]);
}
}
var_dump(Request::filter());
/**
array(7) {
[0]=> string(0) ""
[1]=>string(0) ""
[3]=>array(0) {}
[4]=>bool(false)
[6]=>string(1) "0"
[8]=>string(5) "robin"
[9]=>int(3)
}
*/
var_dump(Request::filter_use_both());
/**
array(3) {
[6]=>string(1) "0"
[7]=>int(0)
[8]=>string(5) "robin"
}
*/
如果是实例化类调用的话,将self替换为$this就可以。