You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP的usort函数回调中$a、$b取值是什么?运行原理是什么?

PHP usort 函数工作原理解答

你编写的代码参考

function so($a, $b) {
        if($a == $b) {
                return 0;
        } 
         else {
                return $a > $b ? 1 : -1;
        }
}

$num = [5,3,2,1,4];
usort($num, 'so');
foreach($num as $value) {
        echo $value." ";
}

以上代码运行后输出 1 2 3 4 5 完全符合usort的设计逻辑,相关原理说明如下:

usort 实际运行逻辑

usort是PHP提供的自定义规则排序函数,底层基于快速排序算法实现。它不会使用PHP默认的大小比较规则,而是完全将「两个元素谁应该排在前面」的判断权交给你传入的回调函数处理,在排序过程中会反复调用回调函数两两比较数组元素,直到整个数组满足排序规则为止。

回调函数中$a、$b的含义

每次排序算法需要比较两个数组元素的顺序时,就会将这两个元素分别赋值给回调函数的$a和$b参数。这两个参数的取值完全由排序过程中当前需要比较的元素决定,没有固定顺序,也不会严格按照数组原有索引顺序传入。
比如你的示例数组是[5,3,2,1,4],排序过程中第一次可能需要比较5和3,此时$a=5、$b=3;后续可能需要比较3和2,此时$a=3、$b=2,以此类推。

返回0、1、-1控制排序的原因

usort对回调函数的返回值有固定的约定,会严格按照返回值调整两个元素的顺序:

  • 返回值小于0:usort判定$a应该排在$b的前面
  • 返回值等于0:usort判定$a和$b大小相等,二者的相对顺序保持不变(PHP 8.0之后usort为稳定排序,之前版本相等元素的顺序不确定)
  • 返回值大于0:usort判定$a应该排在$b的后面

你编写的so函数刚好符合升序排序的规则:
比如当$a=5、$b=3时,$a>$b成立返回1,usort就会把3放到5的前面;当$a=2、$b=4时,$a>$b不成立返回-1,usort就会把2放到4的前面。经过多轮两两比较调整后,整个数组就会按照从小到大的顺序排列,最终输出升序结果。
如果将回调函数的返回规则改为return $a > $b ? -1 : 1,就可以实现从大到小的降序排序,输出结果为5 4 3 2 1。


内容的提问来源于stack exchange,提问作者Shahedul Alam Nishan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:27:04