数组排序函数 asort() 和 ksort() 只能用于一维数组。
二维数组的排序就可以 配合usort()、uasort()或者uksort()的使用我们的自定义排序函数。它必须接受两个参数,并且返回一个值表示哪个参数应该排在前面。负数或者false意味着第一个参数应该排第二个参数前面。正式或者true则表示第二个参数应该排在前面。如果值为0,则表示两个参数值相等。
<?php function my_sort($a,$b) { if ($a==$b) return 0; return ($a<$b)?-1:1; } $a=array(4,2,8,6); usort($a,"my_sort"); $arrlength=count($a); for($x=0;$x<$arrlength;$x++) { echo $a[$x]; echo "<br>"; } ?>
输出结果
2
4
6
8
usort()、uasort()或者uksort()的区别:
usort() 使用用户自定义的比较函数对数组进行排序。
uasort() 使用用户自定义的比较函数对数组按键值进行排序。
uksort() 函数使用用户自定义的比较函数按照键名对数组排序,并保持索引关系
uasort()的使用
<?php function compareByMargin($aryA, $aryB){ if($aryA['margin'] == $aryB['margin']){ return 0; } return ($aryA['margin'] < $aryB['margin']) ? -1 : 1; } function sortxxx(){ $ary = array( array('id' => 1, 'margin' => 100), array('id' => 2, 'margin' => 300), array('id' => 3, 'margin' => 200), ); uasort($ary, 'compareByMargin'); } sortxxx();
返回结果 [ 根据 二维数组的 键margin的值的大小 排序 ]
array { [0]=> { ["id"]=> 1 ["margin"]=> 100 } [2]=> { ["id"]=> 3 ["margin"]=> 200 } [1]=> { ["id"]=> 2 ["margin"]=> 300 } }
遇到的问题:
在类中使用 uasort() 函数时发现报了错误:Warning: uasort() expects parameter 2 to be a valid callback ...
, 然而直接在纯 php 页面测试的时候发现又没问题.
解决方案如下: 在类里这样调用:uasort($ary, array($this,"compareByMargin"))
就可以了.
在类中写成闭包函数的形式
uasort($rows, function ($a, $b) use ($sort) { $itemA = isset($a[$sort]) ? $a[$sort] : null; $itemB = isset($b[$sort]) ? $b[$sort] : null; return strcasecmp($itemA, $itemB); });
补充: strcasecmp() 比较两个字符串(不区分大小写)
strcmp() 比较两个字符串(区分大小写)
uksort() :
如果成功则返回 TRUE,否则返回 FALSE。
如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
自定义函数应接受两个参数,该参数将被数组中的一对键名填充。比较函数在第一个参数小于,等于,或大于第二个参数时必须分别返回一个小于零,等于零,或大于零的整数。
自定义函数:
函数必须设计为返回 -1, 0, 或 1,并应该接受两个供比较的参数,同时以类似下面这样的方式来工作:
- 如果 a = b, 返回 0
- 如果 a > b, 返回 1
- 如果 a < b, 返回 -1
例子:
<?php function my_sort($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } $people = array("Swanson" => "Joe", "Griffin" => "Peter", "Quagmire" => "Glenn", "swanson" => "joe", "griffin" => "peter", "quagmire" => "glenn"); uksort($people, "my_sort"); print_r ($people); ?>
Array ( [swanson] => joe [quagmire] => glenn [griffin] => peter [Swanson] => Joe [Quagmire] => Glenn [Griffin] => Peter )