数组排序最常用的函数就是 sort($arr); 它的作用是按数组的键值升序排列,并且排序后的数组键名不再是原来的键名,是按新数组来重新设置的键名。
而有时我们要求更复杂的排序。如按键名排序,这里用到 ksort($arr); 函数,它会根据数组的键名排序,并维持原有的键值关系。相对应的 asort($arr); 函数,是按键值排序,且维持原有的键值关系。
同样原理,rsort(); arsort(); krsort(); 函数除了排序是按降序排列外,其它与sort(); rsort(); ksort(); 相同。
数组操作是PHP很重要的基础,希望能好好运用。
按键值排序
即按标识符ASCⅡ码值的大小排列顺序。
ksort(): 按照数组标识符顺序排列
krsort(): 按照数组标识符逆序排
实例1:
代码如下 | 复制代码 |
<?php $languages=array( 'c'=>'php', 'd'=>'asp', 'a'=>'jsp', 'b'=>'java' ); krsort($languages); foreach($languages as $key=>$val){ echo "$key = $val".'<br>'; }; ?> |
按元素值排序
asort(): 按照由小到大的顺序对数组排序;
rsort(): 按照由大到小的顺序对数组逆序排序。
将实例1的8-11行代码改为:
代码如下 | 复制代码 |
asort($languages); print_r($languages); echo "<br>"; rsort($languages); print_r($languages); |
删除原有键名排序
sort(): 按照由小到大的顺序对数组排序;
rsort(): 按照由大到小的顺序对数组逆序排序。
将实例2的8-11行代码改为:
代码如下 | 复制代码 |
sort($languages); foreach($languages as $key=>$val){ echo "languages[$key] = $val".'<br>'; }; |
array_multisort -- 对多个数组或多维数组进行排序
说明
bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )
例子 1. 对多个数组排序
代码如下 | 复制代码 |
<?php $ar1 = array("10", 100, 100, "a"); $ar2 = array(1, 3, "2", 1); array_multisort($ar1, $ar2); var_dump($ar1); |
本例中经过排序后,第一个数组将包含 "10","a",100,100。第二个数组将包含 1,1,"2",3。第二个数组中的项目顺序完全和第一个数组中相应的项目(100 和 100)顺序一致。
代码如下 | 复制代码 |
array(4) { [0]=> string(2) "10" [1]=> string(1) "a" [2]=> int(100) [3]=> int(100) } array(4) { [0]=> int(1) [1]=> int(1) [2]=> string(1) "2" [3]=> int(3) } |
例子 2. 对多维数组排序
代码如下 | 复制代码 |
<?php $ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1)); array_multisort ($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); ?>
|
本例中经过排序后,第一个数组将包含 10,100,100,"a"(作为字符串上升排序),第二个数组将包含 1,3,"2",1(作为数值下降排序)。
PHP数组排序函数很多,也很强大
如:arsort,asort,krsort,ksort,sort…
但有时候还是满足不了我们的需求
假如有一个二维数组,我们要按二维数组中的一个值来排序
就需要用到了usort自定义数组排序
例子如下:
代码如下 | 复制代码 |
<?php $aa = array (array ("score"=>60), array ("score"=>70), array ("score"=>80), array ("score"=>90), array ("score"=>20), array ("score"=>10), array ("score"=>50), array ("score"=>30)); echo '------排序前输出------<br />'; var_dump($aa); // 排序前输出 usort($aa, "cmp"); // 排序处理(从大到小) echo '<br />------排序后输出------<br />'; var_dump($aa); // 排序完输出 /** * 自定义排序条件 * @param array $a * @param array $b * @return bool */ function cmp($a, $b) { if ($a["score"] == $b["score"]) { return 0; } return ($a["score"] < $b["score"]) ? 1 : -1; } ?> |
输出结果:
代码如下 | 复制代码 |
------排序前输出------ array(8) { [0]=> array(1) { ["score"]=> int(60) } [1]=> array(1) { ["score"]=> int(70) } [2]=> array(1) { ["score"]=> int(80) } [3]=> array(1) { ["score"]=> int(90) } [4]=> array(1) { ["score"]=> int(20) } [5]=> array(1) { ["score"]=> int(10) } [6]=> array(1) { ["score"]=> int(50) } [7]=> array(1) { ["score"]=> int(30) } } ------排序后输出------ array(8) { [0]=> array(1) { ["score"]=> int(90) } [1]=> array(1) { ["score"]=> int(80) } [2]=> array(1) { ["score"]=> int(70) } [3]=> array(1) { ["score"]=> int(60) } [4]=> array(1) { ["score"]=> int(50) } [5]=> array(1) { ["score"]=> int(30) } [6]=> array(1) { ["score"]=> int(20) } [7]=> array(1) { ["score"]=> int(10) } } |