首页 >php教程 >php手册 >PHP 数组处理(一)

PHP 数组处理(一)

WBOY
WBOY原创
2016-06-06 20:01:181063浏览

导语: 在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);

打印的结果如图:

PHP 数组处理(一)

先分析下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();
看看输出结果:

PHP 数组处理(一)

以上就是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));
打印结果如图

PHP 数组处理(一)


实例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 数组处理(二)...................

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn