5.6 对数组进行排序
对数组排序实际指的是对数组元素排序。使用PHP的有关内置函数,可以对数组元素按多种方式进行排序,下面分别介绍这些函数的用法。
5.6.1 使用sort()对数组进行排序
使用函数sort()对数组元素按顺向排序,即按字母由前向后或按数字由小到大的顺序排序。该函数的语法如下。
bool sort(array &$arr [,int $sort_flag]);
该函数接受一个数组作为输入参数,如果处理成功,该函数返回TRUE,否则该函数返回FALSE。该函数将会删除所要排序的数组原有的索引值,从而为该数组使用新的索引值。代码5-11演示了如何使用该函数为数组元素排序。
代码5-11 使用函数sort()对数组元素排序5-11.php
01 <?php 02 $planet = array( 03 'Earth', 04 'Venus', 05 'Mars', 06 'Jupiter', 07 'Saturn' 08 ); // 定义数组$planet09 10 sort($planet); // 对数组$planet 进行排序 11 12 foreach($planet as $key => $value) 13 { 14 echo 'planet['.$key.']='.$value; // 输出数组中的元素 15 echo '<br/>'; 16 echo '<br/>'; 17 } 18 ?>
图5-10 使用函数sort()对数组元素排序
【代码解析】代码第10行使用sort()函数对数组$planet进行了排序,读者可以通过对比结果来看看数组发生的变化。这段代码的执行结果如图5-10所示。
该函数的第2个参数是可选的,使用它可以改变排序方式。实际应用当中,第2个参数很少使用,这里就不再赘述。
5.6.2 使用rsort()对数组进行逆向排序
使用函数rsort()可以对数组元素做逆向排序,即按字母从后到前或按数字由大到小的顺序排序。该函数的语法如下。
bool rsort(array &$arr [,int $sort_flag]);
该函数接受一个数组作为输入参数,如果处理成功,函数返回TRUE,否则返回FALSE。该函数将会删除所要排序的数组原有的索引值,从而为该数组使用新的索引值。代码5-12演示了函数rsort()的用法。
代码5-12 使用函数rsort()对数组元素排序5-12.php
01 <?php 02 $planet = array( 03 'Earth', 04 'Venus', 05 'Mars', 06 'Jupiter', 07 'Saturn' 08 ); // 定义数组$planet 09 10 rsort($planet); // 对数组元素进行排序 11 12 foreach($planet as $key => $value) 13 { 14 echo 'planet['.$key.']='.$value; // 输出数组元素 15 echo '<br/>'; 16 echo '<br/>'; 17 } 18 ?>
【代码解析】代码第10行使用函数rsort()对第02~08行定义的数组$planet进行了逆向排序。读者可以对比结果来了解数组发生的变化。这段代码的执行结果如图5-11所示。
该函数的第2个参数也是可选的,可以用它来改变排序方式。对于初学者来说,这个参数很少使用到,这里不再赘述。
5.6.3 排序时保持原数组的索引
前文介绍的两个函数sort()和rsort(),都会为要排序的数组重新建立索引。有时对数组排序后仍需要保持原数组的索引,对于这种情况,在PHP中可以使用如下两个函数。
·asort():该函数对数组元素进行排序,并且保持数组的原索引关系不变。该函数仍然对数组元素按顺向排序。如果处理成功,该函数返回TRUE,否则返回FALSE。
·ksort():该函数对数组元素按索引名顺序排序,并且保持数组的原索引关系不变。如果处理成功该函数返回TRUE,否则返回FALSE。该函数主要用于关联数组。
代码5-13演示了这两个函数的用法。
代码5-13 使用函数asort()和ksort()对数组元素排序5-13.php
01 $planet2 = array( 02 'X'=>'Earth', 03 'Y'=>'Venus', 04 'Z'=>'Mars', 05 'A'=>'Jupiter', 06 'B'=>'Saturn' 07 ); // 定义数组$planet2 08 09 asort($planet1); // 使用asort() 排序 10 ksort($planet2); // 使用ksort() 排序 11 12 echo ' 使用函数asort 对数组元素排序:'; 13 echo '<br/>'; 14 15 foreach($planet1 as $key => $value) // 通过循环输出$planet1 的索引和元素 16 { 17 echo 'planet1['.$key.']='.$value; 18 echo '<br/>'; 19 echo '<br/>'; 20 } 21 22 echo '<br/>'; 23 echo ' 使用函数ksort 对数组元素排序:'; 24 echo '<br/>'; 25 26 foreach($planet2 as $key => $value) // 通过循环输出$planet2 的索引和元素 27 { 28 echo 'planet2['.$key.']='.$value; 29 echo '<br/>'; 30 echo '<br/>'; 31 } 32 ?>
【代码解析】此代码没有很特殊的地方,只是先定义一个数组,然后使用函数asort()和ksort()对数组的元素和数组的索引进行排序。这段代码的执行结果如图5-12所示。
函数sort()按顺向排序数组元素,它有一个对应的逆向排序函数——rsort()。同样,函数asort()和ksort()也分别有一个对应的逆向排序函数arsort()和krsort()。这两个函数分别按照asort()和ksort()的处理方式逆向排序数组元素,它们的用法和函数rsort()类似,这里不再重复举例。
图5-11 使用函数rsort()对数组元素逆向排序
图5-12 使用asort()和ksort()对数组元素排序
5.6.4 数组的随机排序
PHP提供一个随机排序数组元素的函数shuffle(),该函数的语法如下。
bool shuffle (array $array)
该函数为参数数组$array中的元素赋予新的键名,这将删除原有的键名,而不仅仅是重新排序。如果执行成功该函数返回TRUE。代码5-14演示了该函数的用法。
代码5-14 使用函数shuffle()对数组元素进行随机排序5-15.php
01 <?php 02 $cellphone_brand = array( 03 'nokia', 04 'moto', 05 'lenovo', 06 'tcl' 07 ); // 定义数组$cellphone_brand 08 09 echo ' 原数组:'; 10 echo '<br/>'; 11 echo '<pre>'; 12 print_r($cellphone_brand); // 输出数组$cellphone_brand 的结构 13 echo '<br/>'; 14 15 shuffle($cellphone_brand); // 进行随机排序 16 echo '<br/>'; 17 18 echo ' 元素被重新排序后:'; 19 echo '<br/>'; 20 echo '<br/>'; 21 22 foreach ($cellphone_brand as $cpb) 23 echo $cpb.' '; 24 echo '<br/>'; 25 ?>
【代码解析】第1次执行该代码后,将会有如图5-13所示的执行结果,可以看到调用函数shuffle()之后,数组元素被随机排序。然后再次执行该代码,会看到数组元素再次被随机排序,和第1次的结果不同,如图5-14所示。
图5-13 随机排序数组元素结果(1)
图5-14 随机排序数组元素结果(2)
5.6.5 数组的反向排序
本节最后介绍一个可以将数组元素按原顺序反向排序的函数,该函数是array_reverse(),语法如下。
array array_reverse (array $array [, bool $preserve_keys])
该函数返回一个与原数组单元顺序相反的数组,原数组以参数$array传入该函数,该函数的第2个参数是可选的,如果第2个参数$preserve_keys设置为TRUE,则原数组的键名将会被保留。代码5-15演示了该函数的用法。
代码5-15 使用函数array_reverse()对数组元素按原顺序反向排序5-15.php
01 <?php 02 $cellphone_brand = array( 03 'nokia', 04 'moto', 05 'lenovo', 06 'tcl' 07 ); // 定义数组$cellphone_brand 08 09 echo ' 原数组:'; 10 echo '<br/>'; 11 12 echo '<pre>'; 13 print_r($cellphone_brand); // 输出原数组的结构 14 echo '</pre>'; 15 16 $cpb = array_reverse($cellphone_brand); // 按原顺序反向排序 17 18 echo '<br/>'; 19 echo ' 按原顺序反向:'; 20 echo '<pre>'; 21 print_r($cpb); 22 echo '</pre>'; 23 ?>
【代码解析】执行这段代码,可以看到如图5-15所示的效果。从图中可以看出,函数array_reverse()会将原数组元素顺序颠倒后,返回到一个新数组当中,原数组并未改变。
图5-15 使用array_reverse()反向排序数组元素