一、什么是usort?
在PHP中,usort()是用于对数组进行排序的函数,其整体语法如下:
bool usort ( array &$array , callable $callback )
其中,$array参数是被排序的数组,$callback参数是回调函数,用于比较两个元素的大小。
该函数采用快速排序算法对数组进行排序。与sort()函数不同的是,usort()允许使用自定义的比较函数。
二、如何使用usort?
使用usort进行数组排序的一般步骤如下:
- 定义一个回调函数,用于比较两个数组元素的大小。
- 调用usort函数,传入被排序的数组和回调函数。
其中,回调函数的代码可以自定义,但需要返回三种不同情况中的一种:
- 返回值小于0,表示$a小于$b,即$a排在$b的前面。
- 返回值等于0,表示$a等于$b,即$a和$b的顺序不变。
- 返回值大于0,表示$a大于$b,即$a排在$b的后面。
下面是一个示例回调函数的代码:
function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; }
该函数使用了三目运算符,判断$a是否小于$b,若是,返回-1,否则返回1。
接下来,我们可以调用usort()函数,将上述回调函数作为参数传入,实现对数组的排序:
$array = array(3, 1, 6, 2, 8, 5); usort($array, "cmp"); print_r($array);
输出结果为:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 5 [4] => 6 [5] => 8 )
可以看出,该数组已经按照从小到大的顺序排列了。
三、如何自定义回调函数?
在上一个示例中,我们定义了一个简单的回调函数,但实际应用中,我们可能需要使用更为复杂的比较方式。
例如,对于一个关联数组,我们可能需要按照其中某个键值进行排序。这时,我们可以使用匿名函数的方式自定义回调函数:
$array = array( array("id" => 1, "name" => "Tom", "age" => 20), array("id" => 2, "name" => "Jerry", "age" => 18), array("id" => 3, "name" => "Lucy", "age" => 22) ); usort($array, function($a, $b) { return $a['age'] - $b['age']; }); print_r($array);
输出结果为:
Array ( [0] => Array ( [id] => 2 [name] => Jerry [age] => 18 ) [1] => Array ( [id] => 1 [name] => Tom [age] => 20 ) [2] => Array ( [id] => 3 [name] => Lucy [age] => 22 ) )
可以看出,该数组已经按照年龄的从小到大的顺序排列了。
四、注意事项
在使用usort()函数时,需要注意以下事项:
- 回调函数中必须使用引用传参。
- 回调函数中不能使用箭头函数,因为箭头函数无法访问$this。
- 回调函数中不能使用eval()函数或者变量函数来调用。
五、总结
使用usort函数可以灵活地对数组进行排序,而且不受原数组元素类型的限制,可以自定义各种排序规则。但在使用过程中需要注意回调函数的编写和注意事项。