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

详解PHP中usort()函数及自定义cmp()函数逻辑疑问求助

搞懂usort()和自定义cmp()函数的协同逻辑

嘿,我来帮你把这个逻辑掰明白!其实usort()和你的cmp()函数就是「指挥官」和「裁判」的关系——usort()负责统筹整个排序流程,而你的cmp()函数专门负责告诉它两个元素谁该排在前面。

核心规则先搞清楚

首先得记住usort()对cmp()返回值的严格要求,这是一切的基础:

  • 返回 -1:告诉usort()「$a应该排在$b的前面」
  • 返回 0:告诉usort()「$a和$b的相对位置不用变」
  • 返回 1:告诉usort()「$b应该排在$a的前面」

结合你的代码来拆解

先把你的代码补全(假设完整数组是array('a' => 4, 'b' => 8, 'c' => 2, 'd' => 5)),方便分析:

function cmp($a, $b) {
    echo "Iteration: " . $a . " > " . $b;
    if($a<$b) {
        echo " FALSE <br>";
    } elseif($a>$b) {
        echo " TRUE <br>";
    } else {
        echo " ??? <br>";
    }
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => 2, 'd' => 5);
usort($array, 'cmp');
print_r($array);

实际运行时的流程

usort()会调用底层的高效排序算法(PHP用的是快速排序实现),这个算法会反复调用你的cmp()函数,每次拿数组里的两个元素来比较:

  1. 第一次可能拿4和8比较:cmp()输出Iteration: 4 > 8 FALSE <br>,返回-1——告诉usort()把4放在8前面。
  2. 接着拿8和2比较:输出Iteration: 8 > 2 TRUE <br>,返回1——告诉usort()把2放在8前面。
  3. 然后拿4和2比较:输出Iteration:4 >2 TRUE <br>,返回1——告诉usort()把2放在4前面。
  4. 以此类推,直到所有元素的顺序都符合你的比较规则,最终数组会被排序成[2,4,5,8]。

为什么会有这么多次迭代?

因为排序算法需要通过多次两两比较来确定每个元素的最终位置,不是一次性就能排好的——你的echo输出就是在跟踪每一次的比较动作,方便你调试排序过程。

几个要注意的小细节

  • 别在cmp()里加不必要的副作用(比如你的echo是调试用的没问题,但生产代码记得去掉),否则会影响排序效率。
  • 必须返回整数(-1、0、1),不能返回布尔值(比如return $a > $b),否则usort()会把布尔值转成整数(true=1,false=0),导致排序逻辑出错。
  • 如果数组里有相同的元素,返回0会让它们的相对位置尽量保持排序前的状态,但usort()本身不是稳定排序,相同元素的位置仍可能变动,这点要注意。

内容的提问来源于stack exchange,提问作者Japing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:30:05