文章目录
1、数组合并
数组合并一般使用array_merage,但是当合并两个键是数字的数组时,数组的数字索引将会被重置,有时候会引起不便。想要保留数字键值,使用+合并数组
$arr1 = ['13'=>'1166','14'=>'1889'];
$arr2 = ['1'=>'1236','5'=>'1891'];
$arr = $arr1+$arr2;
array_merge合并数组后,键是数字的值,键会从0开始往后排。合并数组时,键名不是数字且键名相同的值,后面数组的值会覆盖前面数组的该值;键名是数字且相等的值,不覆盖前面的值,往后排。
+合并数组后,键是数字的值,保留自身的键。合并数组时,键名相同的值(不分数字或字符串),前面数组的覆盖后面数组中的该值。
使用+的这一特性,我们可以快速实现两个数组的合并去重,如下
先翻转两个数组,然后使用+合并数组,去除两个数组中的重复值,再用array_keys获取值
array_keys(array_flip($user_arr_1)+ array_flip($user_arr_2));
2、二维数组排序
$arr = [
['name'=>'张三','age'=>'15','h'=>'120'],
['name'=>'李四','age'=>'11','h'=>'121'],
['name'=>'王五','age'=>'4','h'=>'122'],
['name'=>'赵六','age'=>'11','h'=>'123'],
];
$sort_arr1 = array_column($arr,'age');
$sort_arr2 = array_column($arr,'h');
//按age顺序排序
array_multisort($sort_arr1,SORT_ASC,$arr);
//先按age顺序排序,age相同的再按h倒叙排序
array_multisort($sort_arr1,SORT_ASC,$sort_arr2,SORT_DESC,$arr);
3、 在类外部修改类的私有属性
class aa{
private $bb = 'fkkyy';
public function __get($name){
return $this->bb;
}
}
$class = new aa();
echo $class->cc;
在这个类中,我们通过get把bb的值赋给了cc,输出了:fkkyy。这个时候我们想要把bb的值修改一下,在原来有代码中,我们只能直接在类中修改。
想在类外修改的话,我们需要用到 Closure::bind(),把类的作用域绑定到一个匿名函数上,然后再匿名函数内修改bb的值即可
class aa{
private $bb = 'fkkyy';
public function __get($name){
return $this->bb;
}
}
$class = new aa();
$func = \Closure::bind(function(){$this->bb='fuck you';}, $class,'aa');
$func();
echo $class->cc;
成功输出:fuck you
4、 get_class 和 get_called_class的区别
get_class :获取定义当前方法的类名
get_called_class:获取正在调用当前方法的类名
5、assert断言和if判断的区别
assert(1==2);断言失败后直接报错
if(1 == 2){};判断不符合,不影响后续代码执行
6、获得指定月份的开始和结束时间戳
$time = '2018-05';
$timebegin = strtotime($time) ; //开始时间戳
$day = date('t',$timebegin);
$timeend = $timebegin + 86400 * $day - 1; //结束时间戳
7、获取两个数组的差异值
原始数组 [1,2,3,4,5],数组经过修改后,变为 [4,5,6,7,8]
想要获取数组变动后,哪些值是删除的值,哪些值是增加的值
传统做法是进行双层遍历,数组为空时,还要做特殊判读,代码较长
我们可以使用php的两个函数,使用三行代码得到变动的结果,如下
$a = [1,2,3,4,5];
$b = [4,5,6,7,8];
//首先获取两个数组的交集
$intersect = array_intersect($a,$b);
//数组a和交集取差集,a里有但是交集没有的值,说明是被减掉的值
$dec = array_diff($a,$intersect);
//数组b和交集取差集,b里有但是交集没有的值,说明是新增的值
$inc = array_diff($b,$intersect);