详解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()函数,每次拿数组里的两个元素来比较:
- 第一次可能拿
4和8比较:cmp()输出Iteration: 4 > 8 FALSE <br>,返回-1——告诉usort()把4放在8前面。 - 接着拿
8和2比较:输出Iteration: 8 > 2 TRUE <br>,返回1——告诉usort()把2放在8前面。 - 然后拿
4和2比较:输出Iteration:4 >2 TRUE <br>,返回1——告诉usort()把2放在4前面。 - 以此类推,直到所有元素的顺序都符合你的比较规则,最终数组会被排序成
[2,4,5,8]。
为什么会有这么多次迭代?
因为排序算法需要通过多次两两比较来确定每个元素的最终位置,不是一次性就能排好的——你的echo输出就是在跟踪每一次的比较动作,方便你调试排序过程。
几个要注意的小细节
- 别在
cmp()里加不必要的副作用(比如你的echo是调试用的没问题,但生产代码记得去掉),否则会影响排序效率。 - 必须返回整数(-1、0、1),不能返回布尔值(比如
return $a > $b),否则usort()会把布尔值转成整数(true=1,false=0),导致排序逻辑出错。 - 如果数组里有相同的元素,返回0会让它们的相对位置尽量保持排序前的状态,但
usort()本身不是稳定排序,相同元素的位置仍可能变动,这点要注意。
内容的提问来源于stack exchange,提问作者Japing
相关产品推荐
相关产品推荐

