每天一个常用PHP函数-array_walk、array_map

100人浏览   2025-01-05 09:46:59


场景

永远不能相信用户的输入,那么对api中的参数进行统一过滤,就需要去遍历数组?

语法

array_map ( callable $callback , array $array1 [, array $... ] ) : array
数组中的元素作为参数,执行callback,返回值是新数组
$callback($element) 


array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) : bool
数组中的元素作为参数,执行callback, 这里是引用传值,会直接修改原数组
$callback(&$value, $key), 数组的元素值与key

使用

$params = [
    'name' => '愤怒的鸟',
    'password' => 'abcd99>',
];

print_r($params);

print_r(array_map(function($value){
    return trim($value, '>');
}, $params));

/**
Array
(
    [name] => 愤怒的鸟
    [password] => abcd99>
)
Array
(
    [name] => 愤怒的鸟
    [password] => abcd99
)

**/

再比如api参数格式不统一如何处理?下划线转驼峰


$params = [
    'name' => '愤怒的鸟',
    'totalAmount' => 100,
    'remain_amount' => 8
];

$paramsToCamelbak = function($key){
    $keyTmp = ucwords(str_replace(['_'], ' ', $key));
    return lcfirst(str_replace(' ', '', $keyTmp));
};

$newKeys = array_map($paramsToCamelbak, array_keys($params));
$values = array_values($params);

// 合并数组
print_r(array_combine($newKeys, $values));

/**
Array
(
    [name] => 愤怒的鸟
    [totalAmount] => 100
    [remainAmount] => 8
)


**/


再想如果参数中的url有的带有http协议有的没有,那在入库前可以做一次统一处理

$params = [
    'name' => '愤怒的鸟',
    'avatar' => 'www.laiyige.com',
    'face_url' => 'http://www.sss.com',
    'gender' => 'man'
];

print_r($params);


array_walk($params, function(&$value, $key){
    if (in_array($key, ['avatar', 'face_url'])) {
        $value = 'http://'. ltrim($value, 'http://');
    }
});

print_r($params);



/**
Array
(
    [name] => 愤怒的鸟
    [avatar] => www.laiyige.com
    [face_url] => http://www.sss.com
    [gender] => man
)
Array
(
    [name] => 愤怒的鸟
    [avatar] => http://www.laiyige.com
    [face_url] => http://www.sss.com
    [gender] => man
)


**/

相关推荐