PHP 数组处理(一)
导语: 在PHP中如果能熟练掌握数组相关的知识,您将对PHP 有了很深刻的认识,将会处理很多事情,PHP数组确实很强大,每个PHP开发人员都需要掌握,这样才能在项目中运用自如。 一、array_values() 这个函数返回一个包含给定数组中所有键的数组,但不保留键名
导语:
在PHP中如果能熟练掌握数组相关的知识,您将对PHP 有了很深刻的认识,将会处理很多事情,PHP数组确实很强大,每个PHP开发人员都需要掌握,这样才能在项目中运用自如。
一、array_values()
这个函数返回一个包含给定数组中所有键值的数组,但不保留键名
如:$va = array(1=>23,'l'=>45,9=>90); array_values($va); 将会得到 array(23,45,90);
这个函数用的挺多的,比如:在数据库中获取列表内容后,foreach 分析数据,如果每条记录中不满足相关条件,将会过滤,那么这个时候数组的键值将会发生改变,这个时候就可以用到array_values这个函数:
$result = M("ly_vip")->select();
foreach($result as $k=>$v){
if(!$v['isonly'])continue;
$res[$k] = $v;
}
$res = array_values($res);
二、array_diff()
返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。
如 $arr1 = array(1,2,3,4);
$arr2 = array(2,3,9,10);
$diff = array_diff($arr1, $arr2);
那么得知$diff变量的值为array(1,4);
应用场景:前段时间在开发项目时候有个场景用到这个方法,并且感觉不错,拿出来和大家分享分享下:
项目中的详情页有3000多个,每天凌晨的时候用计划任务生成静态页面,这里涉及到有可能有的详情页过期问题,那么就会将昨天的多余的数据删掉,不然用户也能访问不存在的静态页面,这样就会很麻烦,这个时候就可以使用array_diff函数,他能较好的处理这个问题。我们可以将每天生成的静态页面的id记录到一个数组中保持到文件,然后每天生产完静态页面后去和昨天的数组id进行比较 如昨天的是$tmp2 = array(); 今天的是$tmp2 = array() 那么需要删掉昨天的多余的数据可以使用下面的方法:
$diff_tmp = array_diff($tmp2, $tmp1);
foreach($diff_tmp as $k=>$v){
@unlink("./play/".$v.".shtml");即可。
}
三、array_map()
将回调函数作用在给定的回调函数中,这个回调函数作用在数组中的每个单元中,并返回数组,键值保持不变。
返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给
array_map() 函数的数组数目一致。
1、我们先看下在函数中使用array_map(),如下列
$arr = array('s'=>1,'sa'=>2,'tm'=>array(1=>2,4=>9)); function getArr($value){ return is_array($value)?array_map('getArr',$value):$value+1; } $smm = getArr($arr); print_r($smm);
打印的结果如图:
先分析下getArr这个函数,这个函数是作用到数组中的每个单元,将每个单位的数值+1,然后返回,键值保持不变,看打印的结果也可以知道,每个单元元素+1返回了
应用场景:
如我们获取数据库中的数据,需要对每条内容进行处理,比如如果需要对每条记录中的每个单元进行反转义处理,这个时候我们就可以用到array_map这个函数,下面看如下代码:
函数部分
function stripslashes_deep($value){ $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; }
控制器中的类部分
public function getFilm(){ $film = M("Film"); $data = array('status'=>1,'isonly'=>2); $result = $film->where($data)->select(); if($result){ foreach($result as $k=>$v){ $result[$k] = stripslashes_deep($v); } }else{ return FALSE; } return $result; }
以上就列举了一个应用场景,其他都差不多。
2、在类中如何使用
我们看了上述1的列子后,有朋友会问,如果在PHP类中通过array_map函数回调内部方法要如何做呢?,那就没必要将stripslashes_deep函数写到一个函数文件中,能不能写到类中作为一个类中的方法,我们来看下如下类:
class A{ function sn($n){ return $n*$n*$n; } function test(){ $arr = array(1,2,4); $array = array_map(array($this,"sn"), $arr); print_r($array); } } $aa = new A(); $aa->test();看看输出结果:
以上就是array_map函数的两种使用方法,希望大家给出意见,谢谢!
三、array_filter()函数
用回调函数过滤数组中的单元,如果没有回调函数,那么默认就是删除数组中值为false的内容。
使用说明;
array array_filter ( array $input [, callback $callback ] )
实例1:
$array = array(1=>0,2=>34,9=>223,'s'=>null,'sg'=>''); var_dump(array_filter($array));打印结果如图
实例2:带有回调函数
function checkId($id){
return ($id %2 == 1)
}
$ids = array(1,2,4,5,7,8,9);
array_filter($ids,'checkId');
返回结果为:array(1,5,7,9);
注意:array_filter和array_map的区别
A、array_map作用回调函数的时候,函数传递的参数位置不一样,array_map先传递回调函数,后传递数据,而array_filter是先数据后回调函数
B、array_map作用回调函数后,返回的新数组个数保持不变、而array_filter则不是!
其他函数功能陆续添加、请关注PHP 数组处理(二)...................