深入理解PHP数组函数和预定义接口
一、 PHP对数组的过滤
函数: array_filter(p1[,p2])
参数p1是要过滤的数组,参数p2是自定义过滤会掉函数(可以是匿名函数)
例子:
1 <?php
2 $arr = ['',null,0,1,2];
3 $newArr = array_filter($arr);
4 var_dump($newArr);
5 //结果是: [1,2]
6 //array_filter()在不填第二参数的情况下会去除数组中为false的元素
总结: array_filter(p1[,p2])函数可以自定义过滤, 在不填写第二参数的情况下默认取出数组中为false的元素;
二、 PHP取出数组中指定列
函数: array_column( array $input
, mixed $column_key
[, mixed $index_key
= null ])
参数1是数组,参数2是要取出列的下标(作为新数组的值),参数三是要取出列的下标(作为新数组的键)
例子:
1 <?php
2 $arr = [
3 ['id' => 1, 'name' => 'lili', 'sex' => 1],
4 ['id' => 2, 'name' => 'xiaoming', 'sex' => 0],
5 ];
6 $columnArr = array_column($arr, 'id');
7 var_dump($columnArr);
8 //结果: [1, 2]
9 $columnArr1 = array_column($arr, 'id', 'name');
10 var_dump($columnArr1);
11 //结果: ['lili' => 1, 'xiaoming' => 2]
三、PHP对数组的去重
函数: array array_unique ( array $array
[, int $sort_flags
= SORT_STRING ] )
参数1是数组,参数2是数组值的排序方式,多个值重复,此函数去保留第一个遇到的值的下标.
例子:
1 <?php
2 $arr = [1,1,1,2,3,4];
3 $arr1 = ['a' => 1, 'b' => 1, 'c' => 3];
4 var_dump(array_unique($arr)); //array(4) { [0]=> int(1) [3]=> int(2) [4]=> int(3) [5]=> int(4) }
5 var_dump(array_unique($arr1));//array(2) { ["a"]=> int(1) ["c"]=> int(3) }
四、PHP取出两个数组中不同的元素
函数: array array_diff ( array $array1
, array $array2
[, array $...
] )
此函数可以有多个参数,此函数拿参数1和其他参数比较,取只在参数1中有的元素
例子:
1 <?php
2 $arr = [1, 2, 3];
3 $arr1 = [4, 5, 1];
4 $arr2 = [6, 7, 3];
5
6 var_dump(array_diff($arr, $arr1, $arr2)); //array(1) { [1]=> int(2) }
五、 PHP取出两个数组的交集
函数: array array_intersect ( array $array1
, array $array2
[, array $...
] )
此函数和array_diff正好相反, 取出多个数组中都存在的元素, 也可以说是交集.
例子:
1 <?php
2 $arr = [1, 2, 3];
3 $arr1 = [3, 5, 1];
4 $arr2 = [1, 7, 3];
5
6 var_dump(array_intersect($arr, $arr1, $arr2));
7 //array(2) { [0]=> int(1) [2]=> int(3) }
六、 PHP对数组的遍历递归
函数: array_walk_recursive()
对数组中的每个成员递归地应用用户函数
1 <?php
2 $arr = [['id' => 1, 'name' => 'lii'], ['id' => 2, 'name' => 'haa']];
3
4 $tmpArr1 = [];
5 $tmpArr2 = [];
6 array_walk_recursive($arr, function($v, $k)use(&$tmpArr1, &$tmpArr2){
7 array_push($tmpArr1, $k);
8 array_push($tmpArr2, $v);
9 });
10 var_dump($tmpArr1);
11 //array(4) { [0]=> string(2) "id" [1]=> string(4) "name" [2]=> string(2) "id" [3]=> string(4) "name" }
12 echo '<hr />';
13 var_dump($tmpArr2);
14 //array(4) { [0]=> int(1) [1]=> string(3) "lii" [2]=> int(2) [3]=> string(3) "haa" }
七、 PHP对数组的遍历迭代
函数: array_reduce()
对数组的元素进行遍历迭代
例子:
1 $arr = [['id' => 1, 'name' => 'lii'], ['id' => 2, 'name' => 'haa']];
2 $result = array_reduce($arr, function($tmp, $v){
3 array_push($tmp, $v);
4
5 return $tmp;
6 }, []);
7
8 var_dump($result);
9 //array(2) { [0]=> array(2) { ["id"]=> int(1) ["name"]=> string(3) "lii" } [1]=> array(2) { ["id"]=> int(2) ["name"]=> string(3) "haa" } }
第一次遍历把['id' => 1, 'name' => 'lii'] 放进$tmp(空数组)中
第二次遍历把['id' => 2, 'name' => 'haa'] 放进$tmp中
结果:
array(2) { [0]=> array(2) { ["id"]=> int(1) ["name"]=> string(3) "lii" } [1]=> array(2) { ["id"]=> int(2) ["name"]=> string(3) "haa" } }
八、 PHP预定义接口ReflectionClass
映射类接口, 可以反射一个类的映射信息
例子:
1 class Person
2 {
3 public $id;
4 public function __construct($id)
5 {
6 $this->id = $id;
7 }
8 }
9 $reflection = new ReflectionClass('Person');
10 $object = $reflection->newInstanceArgs(['id' => 1]);
11 var_dump($object); //object(Person)#113 (1) { ["id"]=> int(1) }
九、 PHP 预定义接口Closure
1. bindTo //给匿名函数绑定指定的$this对象和类作用域.
2. bind //给匿名函数绑定指定的$this对象和类作用域。,
例子:
1 class A {
2 function __construct($val) {
3 $this->val = $val;
4 }
5 public function getClosure()
6 {
7 //returns closure bound to this object and scope
8 return function()
9 {
10 return $this->val;
11 };
12 }
13 }
14
15 $ob1 = new A(1);
16 $ob2 = new A(2);
17
18 $cl = $ob1->getClosure();
19 echo $cl(), "\n"; //1
20 $cl = $cl->bindTo($ob2);
21 echo $cl(), "\n"; //2
22 var_dump($cl instanceof \Closure); //bool(true)
1 class A {
2 private static $sfoo = 1;
3 private $ifoo = 2;
4 }
5 $cl1 = static function() {
6 return A::$sfoo;
7 };
8 $cl2 = function() {
9 return $this->ifoo;
10 };
11
12 $bcl1 = Closure::bind($cl1, null, 'A');
13 $bcl2 = Closure::bind($cl2, new A(), 'A');
14 echo $bcl1(), "\n"; //1
15 echo $bcl2(), "\n"; //2