欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHP 数组处理(一)

程序员文章站 2022-05-12 11:37:09
...

导语: 在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 数组处理(二)...................