- 1.过滤函数:array_filter
实例(结合正则,返回数组中满足条件的值):
$array = [1,-2,-99,0,'wudy','123sss',37];
$positive = array_filter($array,function ($number){
$patten = "/^[0-9]*$/i";
if(preg_match($patten,$number)){
return $number ;
}
});
print_r($positive); //Array ( [0] => 1 [6] => 37 )
//array_filter删除空值(0、空字符、false )
$number = [-1,0,'',2,'ssss',false ,true ];
$not_empty = array_filter($number);
print_r($not_empty); //Array ( [0] => -1 [3] => 2 [4] => ssss [6] => 1 )
//array_filter 结合 in_array 对两个二维数组求差集
$a = [
[
'id' => 4043,
'violation_no' => 201808171000007,
'violation_indicator_no' => 10030,
'violation_indicator_name'=> '这是一个只有行为警告的违规指标'
],
[
'id' => 4044,
'violation_no' => 201808171000007,
'violation_indicator_no' => 10069,
'violation_indicator_name'=> '永久封号2'
],
[
'id' => 4045,
'violation_no' => 201808171000007,
'violation_indicator_no' => 10089,
'violation_indicator_name'=> '两个富文本警告'
]
];
$b = [
[
'id' => 4043,
'violation_no' => 201808171000007,
'violation_indicator_no' => 10030,
'violation_indicator_name'=> '这是一个只有行为警告的违规指标'
],
[
'id' => 4045,
'violation_no' => 201808171000007,
'violation_indicator_no' => 10089,
'violation_indicator_name'=> '两个富文本警告'
]
];
$c = $this->get_diff_array_by_filter($a,$b ) ;
Lib_Func::P($c);die;
Array
(
[1] => Array
(
[id] => 4044
[violation_no] => 201808171000007
[violation_indicator_no] => 10069
[violation_indicator_name] => 永久封号2
)
)
public function get_diff_array_by_filter($arr1, $arr2)
{
try {
return array_filter($arr1, function ($v) use ($arr2) {
return !in_array($v, $arr2);
});
} catch (\Exception $exception) {
return $arr1;
}
}
-
- array_map(),你可以对数组中的每个元素执行回调方法
$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];
$aliases = array_map('strtolower', $cities);
print_r($aliases) ; //Array ( [0] => berlin [1] => kyiv [2] => amsterdam [3] => riga )
$numbers = [1, -2, 3, -4, 5];
$squares = array_map(function ($number) {
return $number ** 2;
}, $numbers);
print_r($squares) ; //Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
- 3.array_walk
// 同时将数组的键名和键值传入到回调函数,和array_map() 类似,但是工作原理完全不同
//array_walk以引用传值方式传入,所以 array_walk() 不会创建新数组,而是直接修改原数组
//作为源数组,可以将数组的值以引用传递方法传入回调函数,数组的键名直接传入就好了
$fruits = [
'banana' => 'yellow',
'apple' => 'green',
'orange' => 'orange',
];
array_walk($fruits, function (&$value, $key) {
$value = $key . ' is ' . $value;
});
print_r($fruits); //Array ( [banana] => banana is yellow [apple] => apple is green [orange] => orange is orange )
- 4.数组的数学运算
使用 array_sum() 对数组元素进行求和运算,可以存在字符串,会自动忽略英文字符
$numbers = [1, 2, 3, 4, 5,'6','abcd'];
print_r(array_sum($numbers)); //21
array_product 对数组元素执行乘积运算,只能存在数字字符
$numbers = [1, 2, 3, 4, 5,'6'];
print_r(array_product($numbers)); //720
使用 array_reduce() 处理自定义运算规则,只能存在数字字符:
$numbers = [1, 2, 3, 4, 5,'6'];
$a = array_reduce($numbers,function ($carry,$item){
return $carry ? $carry / $item : 1 ;
});
print_r($a) ; //0.0013888888888889 = 1/2/3/4/5/6
// array_reduce 实现foreach数组求和:
$list = [1,2,3,4];
$total = array_reduce($list, function ($result, $v){
var_dump($v) ;
echo "\n";
var_dump($result);
echo "\n";
return $result + $v;
}, 100);
print_r($total);
// $result 为上一次迭代产生的值, $v为当前迭代的值, $initial表示 $result的初始值
输出结果:
int(1)
int(100)
int(2)
int(101)
int(3)
int(103)
int(4)
int(106)
110
//array_reduce 还可以实现 "SELECT * from user where user_id in (1,2,3,4)"
$list = [1,2,3,4];
$str = array_reduce($list, function ($result, $v){
return $result . ',' . $v;
});
echo trim($str, ',');die;
//输出:1,2,3,4
// array_map
$list = ['1', ' 2', ' 3', ' 4', '5 '];
print_r($list);
$list = array_map('trim', $list);
print_r($list);
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
类似的写法还有 array_map('intval', $list); array_map('htmlspecialchars', $list)
-
- array_count_values
//统计数组中值的出现次数,可以使用 array_count_values() 函数。它将返回一个新数组,新数组键名为待统计数组的值,新数组的值为待统计数组值的出现次数
$peple = ['wudy','timo','peter','timo','given','wudy','peter'];
$value = array_count_values($peple);
print_r($value); //Array ( [wudy] => 2 [timo] => 2 [peter] => 2 [given] => 1 )
-
- array_slice
//获取数组中的部分元素 - 比如,获取前三个元素
$numbers = range(1, 10);
$top = array_slice($numbers, 0, 3);
print_r($top);// [1, 2, 3]
- 7.PHP排序数组
PHP 中有关排序的函数都是 引用传值 的,排序成功返回 true 排序失败返回 false。排序的基础函数是 sort() 函数,它执行排序后的结果不会保留原索引顺序
排序函数可以归为以下几类:
a保持索引关系进行排序
k依据键名排序
r对数组逆向排序
u使用用户自定义排序规则排序
- 8.数组函数的组合使用
//通过 array_filter() 和 array_map() 函数仅需一行代码就可以完成空字符截取和去空处理:
$values = ['say', ' bye', '', ' to', ' spaces ', ' '];
$words = array_filter(array_map('trim', $values));
print_r($words); //Array ( [0] => say [1] => bye [3] => to [4] => spaces )
//获取出现频率最高的数组元素,我们可以使用 array_count_values()、arsort() 和 array_slice() 这几个函数:
$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd'];
$values = array_count_values($letters);
print_r($values); //Array ( [a] => 4 [b] => 2 [c] => 1 [d] => 5 )
arsort($values);
print_r($values); //Array ( [d] => 5 [a] => 4 [b] => 2 [c] => 1 )
$top = array_slice($values, 0, 3);
print_r($top) ; //Array ( [d] => 5 [a] => 4 [b] => 2 )
//通过array_sum 与 array_map 函数计算订单价格
$orders = [
['product_id' => 1, 'price' => 99, 'count' => 1],
['product_id' => 2, 'price' => 50, 'count' => 2],
['product_id' => 2, 'price' => 17, 'count' => 3],
];
$sum = array_sum(array_map(function ($item){
return $item['price'] * $item['count'] ;
},$orders) );
print_r($sum) ; //250
- 9.PHP中常用的过滤器函数
//filter_var()函数:如果验证通过返回原值,否则返回false
验证格式:
$input = [
'age' => 18,
'sex' => 'sex',
'email' => '313890735qq.com',
];
var_dump( filter_var($input['email'], FILTER_VALIDATE_EMAIL)); //输出:bool(false)
var_dump( filter_var($input['age'], FILTER_VALIDATE_INT)); // 输出:int(18)
//第二个参数的取值:
1>FILTER_VALIDATE_BOOLEAN .当第一个参数是”1″, “true”, “on” and “yes” 这些字符串时会返回true .否则为false 。所以当用户输入一些 类似布尔类型的值时,你就无需一个个去写if else了。这个参数帮你搞定自动转换
2>FILTER_VALIDATE_EMAIL 验证是否为电子邮箱格式
3>FILTER_VALIDATE_FLOAT 验证是否为FLOAT类型
4>FILTER_VALIDATE_INT 验证是否为INT类型
5>FILTER_VALIDATE_IP 验证是否为IP地址
6>FILTER_VALIDATE_MAC 验证是否是mac地址
7>FILTER_VALIDATE_REGEXP 判断是否是正则表达式(基于PCRE)。这个很有用哦。尤其做后台时,管理员可能需要进行正则内容的填写。
8>FILTER_VALIDATE_URL 是否是合法的URL
//净化过滤:FILTER_SANITIZE_NUMBER_INT 过滤掉非数字型的内容
$result = 'wudy123abc666';
var_dump(filter_var($result,FILTER_SANITIZE_NUMBER_INT)); //输出:"123666"
FILTER_SANITIZE_MAGIC_QUOTES(在预定义的字符串前面设置反斜杠\), 一定义的字符串有( ' " \ null ) ,相当于 addslashes(),设置为FILTER_SANITIZE_MAGIC_QUOTES的过滤器会对字符串执行 addslashes() 函数。
$res = "fuck'123" ;
var_dump(filter_var($res,FILTER_SANITIZE_MAGIC_QUOTES)); //输出:"fuck\'123"
$res = 'fuck \/ 23' ;
var_dump(addslashes($res)); //输出:"fuck \\/ 23"
var_dump(filter_var($res,FILTER_SANITIZE_MAGIC_QUOTES)); //输出:"fuck \\/ 23"
FILTER_SANITIZE_STRING: 过滤器去除或编码不需要的字符,用于去除标签以及删除或编码不需要的字符,可能的选项或标志:
FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 &
$data = "123";
var_dump(filter_var($data,FILTER_SANITIZE_STRING)); //输出: "123"
$data2 = "fuck < 5 >6" ;
var_dump(filter_var($data2, FILTER_SANITIZE_STRING)) ; //输出: "fuck 6"
- 10数组取指定的键名
//对数组
$raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];
//只想取包含了id和name的部分
public function test($array, $keys){
return array_intersect_key($array, array_flip($keys));
}
调用: $this->test($raw, ['id', 'name'])
输出:
Array
(
[id] => 1
[name] => zane
)
- 11.数组移除指定键名
$raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];
public function removeKeys($array, $keys){
return array_diff_key($array, array_flip($keys));
}
调用:$this->removeKeys($raw, ['id', 'name'])
输出:
Array
(
[password] => 123456
)