零起点php入门第15课-php数组(4)

Author: 陌小雨Date: 2016-09-20View: 63

一鼓作气,陌小雨继续为大家分享零起点php入门第15课,依然是数组元素相关操作。

1、数组排序

排序在数组中是比较常用的操作。例如可以用来完成根据学生的成绩进行排名等操作。首先我们来使用for循环来对一个数组的元素进行排序。

<?php
	$arr=array(35,43,56,2,76,23,47,55,71);		//定义一个数组
	echo '数组排序之前的信息:<br />';
	print_r($arr);		//输出排序前的数组信息
		for($i=0;$i<count($arr);$i++){		//对数组进行排序
			for($j=0;$j<count($arr)-1;$j++){
				if($arr[$j]>$arr[$j+1]){		//判断前后元素的大小
				$b=$arr[$j];		//交换元素的值
				$arr[$j]=$arr[$j+1];
				$arr[$j+1]=$b;
				}	
			}
		}
	echo '<br />数组排序之后的信息:<br />';
	print_r($arr);		//输出排序后的数组信息
?>

上述代码运行结果为:

数组排序之前的信息:
Array ( [0] => 35 [1] => 43 [2] => 56 [3] => 2 [4] => 76 [5] => 23 [6] => 47 [7] => 55 [8] => 71 )
数组排序之后的信息:
Array ( [0] => 2 [1] => 23 [2] => 35 [3] => 43 [4] => 47 [5] => 55 [6] => 56 [7] => 71 [8] => 76 )

从运行结果排序后的数组可以看出,我们完成了对数组的排序。由于排序的语句(代码中5~13行)是相对固定的,因此我们就可以将其封装为函数来使用。

<?php
	function mysort($arr){		//将排序的代码封装为函数
		echo '<br />数组排序之前的信息:<br />';
		print_r($arr);		//输出排序前的数组信息
		for($i=0;$i<count($arr);$i++){		//对数组进行排序
			for($j=0;$j<count($arr)-1;$j++){
				if($arr[$j]>$arr[$j+1]){
				 $b=$arr[$j];
				 $arr[$j]=$arr[$j+1];
				 $arr[$j+1]=$b;
				}	
			}
		}
		echo '<br />数组排序之后的信息:<br />';
		print_r($arr);		//输出排序前的数组信息	
	}
	$arr1=array(654,853,123,147,259,377);		//定义数组
	$arr2=array(23,45,1,12,22,90,145,75);
	$arr3=array(123,23,741,638,254,36,11);
	mysort($arr1);		//使用自定义函数排序	
	mysort($arr2);		//使用自定义函数排序	
	mysort($arr3);		//使用自定义函数排序
?>

上述代码将完成排序的代码封装为函数并对多个数组进行排序。运行结果为:

数组排序之前的信息:
Array ( [0] => 654 [1] => 853 [2] => 123 [3] => 147 [4] => 259 [5] => 377 )
数组排序之后的信息:
Array ( [0] => 123 [1] => 147 [2] => 259 [3] => 377 [4] => 654 [5] => 853 )
数组排序之前的信息:
Array ( [0] => 23 [1] => 45 [2] => 1 [3] => 12 [4] => 22 [5] => 90 [6] => 145 [7] => 75 )
数组排序之后的信息:
Array ( [0] => 1 [1] => 12 [2] => 22 [3] => 23 [4] => 45 [5] => 75 [6] => 90 [7] => 145 )
数组排序之前的信息:
Array ( [0] => 123 [1] => 23 [2] => 741 [3] => 638 [4] => 254 [5] => 36 [6] => 11 )
数组排序之后的信息:
Array ( [0] => 11 [1] => 23 [2] => 36 [3] => 123 [4] => 254 [5] => 638 [6] => 741 )

从运行结果我们可以看到,使用我们的自定义函数很轻松就完成了对三个数组的排序,这也再一次体现了函数的优势。由于排序操作在数组中很常用,因此PHP提供了多个系统排序函数供我们使用,他们主要有sort、rsort和usort。这三个函数的原型如下所示:

bool sort ( array &$array [, int $sort_flags ] )  //用于对数组正向(从小到大)排序

bool rsort ( array &$array [, int $sort_flags ] )  //用于对数组逆向(从大到小)排序

这两个函数的使用方法类似,参数array为要进行排序的数组;参数fort_flags用来改变排序的方式,主要有如下三个选项:

SORT_REGULAR:正常比较元素(默认方式);

SORT_NUMERIC:元素被作为数字来比较;

SORT_STRING:元素被作为字符串来比较。

<?php
	$arr=array(2,54,167,'a','A','12');		//定义一个数组
	echo '数组排序之前的信息:<br />';
	print_r($arr);		//输出数组的信息
	echo '<br />数组普通排序之后的信息:<br />';
	sort($arr);			//对数组进行排序
	print_r($arr);
	echo '<br />数组作为数字排序之后的信息:<br />';
	sort($arr,SORT_NUMERIC);		//将数组的元素转换为数字进行排序
	print_r($arr);
	echo '<br />数组作为字符排序之后的信息:<br />';
	sort($arr,SORT_STRING);		//将数组的元素转换为字符进行排序
	print_r($arr);
?>

上述代码运行结果为:

数组排序之前的信息:
Array ( [0] => 2 [1] => 54 [2] => 167 [3] => a [4] => A [5] => 12 )
数组普通排序之后的信息:
Array ( [0] => A [1] => a [2] => 2 [3] => 12 [4] => 54 [5] => 167 )
数组作为数字排序之后的信息:
Array ( [0] => a [1] => A [2] => 2 [3] => 12 [4] => 54 [5] => 167 )
数组作为字符排序之后的信息:
Array ( [0] => 12 [1] => 167 [2] => 2 [3] => 54 [4] => A [5] => a )

注意:在使用sort函数对字符串进行排序时候,会按照字符对应的ASCII值进行排序。对混合类型的数组进行排序的时候可能会产生无法预料的结果。

sort和rsort函数的使用和理解都比较简单,陌小雨就不再做详细讲解了。

另一个与排序数组类似的函数是shuffle函数,它用来对数组进行随机排序即将数组元素的顺序打乱,它的原型如下:

bool shuffle ( array &$array )

参数array即为需要进行随机排序的数组,它的使用非常简单。

<?php
	$arr=array(3,23,'A','f','123','hello');		//定义一个数组
	echo '排序之前的数组信息:<br />';
	print_r($arr);
	shuffle($arr);		//对数组进行随机排序
	echo '<br />排序之后的数组信息:<br />';
	print_r($arr);		//输出数组信息
?>

上述代码运行结果为:

排序之前的数组信息:
Array ( [0] => 3 [1] => 23 [2] => A [3] => f [4] => 123 [5] => hello )
排序之后的数组信息:
Array ( [0] => f [1] => A [2] => hello [3] => 23 [4] => 123 [5] => 3 )

注意:由于这个函数输出结果是随机的,因此每次的输出结果可能会不同。

2、过滤数组元素

过滤数组中的元素是一个非常有用的操作。例如可以对分数进行过滤,将100以上的分数从数组中删除。还可以将混合类型数组中的字符串元素输出为一个新数组。也可以在数组中搜索指定的值等等的操作。下面我们通过例子来演示使用自定义函数删除数组中的偶数元素。

<?php
	function myfunc(&$arr){		//自定义一个过滤函数
		$j=count($arr);
		for($i=0;$i<$j;$i++){
			if($arr[$i]%2==0)			
				unset($arr[$i]);
		}
	}
	$arr=array(23,14,37,263,244,379,100,153,150);		//定义一个数组
	echo '数组进行过滤之前的信息:<br />';
	print_r($arr);
	myfunc($arr);		//调用自定义函数
	echo '<br />数组进行过滤之后的信息:<br />';
	print_r($arr);
?>

上述代码运行结果:
数组进行过滤之前的信息:
Array ( [0] => 23 [1] => 14 [2] => 37 [3] => 263 [4] => 244 [5] => 379 [6] => 100 [7] => 153 [8] => 150 )
数组进行过滤之后的信息:
Array ( [0] => 23 [2] => 37 [3] => 263 [5] => 379 [7] => 153 )

从运行的结果我们可以看出,我们的自定义函数成功过滤了数组中的偶数值。这个自定义的函数会修改原来的数组。下面我们来定义一个返回数组中0~100之间元素的函数,并且返回一个新的数组。

<?php
	function myfunc($arr){		//定义过滤函数
		$j=count($arr);
		for($i=0;$i<$j;$i++){
			if($arr[$i]>=0&&$arr[$i]<=100)
				$n_arr[]=$arr[$i];
		}
		return $n_arr;
	}
	$arr=array(2,34,5,175,168,94,942,105);
	echo '原来的数组信息:<br />';
	print_r($arr);
	$newarr=myfunc($arr);		//调用函数并使用变量接收函数的返回值
	echo '<br />过滤出来的新数组信息:<br />';
	print_r($newarr);		//输出新数组的信息
?>

上述代码运行结果:

原来的数组信息:
Array ( [0] => 2 [1] => 34 [2] => 5 [3] => 175 [4] => 168 [5] => 94 [6] => 942 [7] => 105 )
过滤出来的新数组信息:
Array ( [0] => 2 [1] => 34 [2] => 5 [3] => 94 )

除了我们可以自定义数组来过滤数组元素外,PHP还提供了array_filter函数来通过自定义的回调函数来过滤数组中的元素,它的原型如下:

array array_filter ( array $input [, callback $callback ] )

参数input即为要进行过滤的数组;参数callback即为进行过滤的函数,如果回调函数返回TRUE,则input数组的当前值会被包含在返回的结果数组中,数组的键名保留不变。

注意:在使用array_filter函数过滤数组元素的时候不可增加或者删除数组的元素,否则会得到不可预料的结果。

<?php
	function odd($x){		//定义过滤偶数的函数
		if($x%2==1)
			return TRUE;
	}
	function even($x){		//定义过滤奇数的函数
		if($x%2==0)
			return TRUE;
	}
	$arr=array(1,2,3,123,35,47,58,103,116);			//定义一个数组
	echo '过滤前的数组信息:<br />';
	print_r($arr);
	echo '<br />过滤掉偶数后的数组信息:<br />';
	print_r(array_filter($arr,'odd'));			//调用函数对数组进行过滤
	echo '<br />过滤掉奇数后的数组信息:<br />';
	print_r(array_filter($arr,'even'));
?>

上述代码运行结果:

过滤前的数组信息:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 123 [4] => 35 [5] => 47 [6] => 58 [7] => 103 [8] => 116 )
过滤掉偶数后的数组信息:
Array ( [0] => 1 [2] => 3 [3] => 123 [4] => 35 [5] => 47 [7] => 103 )
过滤掉奇数后的数组信息:
Array ( [1] => 2 [6] => 58 [8] => 116 )

当然array_filter函数不只能用来做上面的事情,例如还可以使用该函数将数组中的整数过滤出来。

<?php
	function not_int($x){		//定义过滤非整数的函数
		if(is_int($x))
			return TRUE;
	}
	$arr=array(1,2,'a',3,4,'c','d');		//定义数组
	echo '过滤前的数组信息:<br />';
	print_r($arr);		//输出过滤前的数组信息
	$res=array_filter($arr,'not_int');		//调用函数过滤数组
	echo '<br />过滤后的数组信息:<br />';
	print_r($res);		//输出过滤后的数组信息
?>

上述代码运行结果为:

过滤前的数组信息:
Array ( [0] => 1 [1] => 2 [2] => a [3] => 3 [4] => 4 [5] => c [6] => d )
过滤后的数组信息:
Array ( [0] => 1 [1] => 2 [3] => 3 [4] => 4 )

从运行结果可以看到,使用array_filter函数成功过滤了数组中的非整数的元素。我们还可以过滤掉非字符的元素,这里你可以在下方留言写出,用pre标签包裹。