一鼓作气,陌小雨继续为大家分享零起点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标签包裹。