将$ a> $ b用一组整数打破usort()?

时间:2018-01-31 21:51:04

标签: php sorting

usort()的几乎每个例子中,逻辑似乎都应该返回-1,0或1,这使得新的太空飞船运营商变得理想。在php7之前,最基本的例子是这样的:

usort($arr, function($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

我无法理解为什么不简单地使用:

usort($arr, function($a, $b) {
    return $a > $b;
}

这会在什么条件下破裂吗?

我还阅读了How the usort() sorting algorithm works?,比较了上述两种方法对我生活的结果我无法理解为什么建议的方法会返回不同的结果。

2 个答案:

答案 0 :(得分:2)

usort中使用的当前排序实现可在此处找到:https://github.com/php/php-src/blob/ba298725d194f753c0220bd9ac482e3d257a9ddc/Zend/zend_sort.c#L317

如您所见,它仅使用> 0比较,例如

while (cmp(pivot, i) > 0) {

如果php核心团队出于某种原因改变了使用== 0< 0的实现,那么您的解决方案将会中断(因为它不区分这些情况)。

鉴于文档没有说明如何实施排序 - 可以安全地假设每个不遵循协议的功能都是错误的,并且不能保证有效。

一般情况下 - 对于不稳定的排序只是&#34; $ a是否大于$ b&#34;足够。一些编程语言/库使用它。例如:在Go中,您只需要实现一个返回布尔值的简单Less函数。

答案 1 :(得分:0)

声明 返回$ a&gt; $ B; 等于 如果($ a> $ b)返回1;否则返回0; 因为除整数之外的任何返回类型将被转换为整数值。 以最简单的方式,您的代码仅提供升序。 如果用最快的算法实现usort,这个代码可能会故意失败。在此之前,我认为usort将每个元素与所有其他元素进行比较,对于ASC顺序只需要[0,1],对于DESC顺序只需要[0,-1]。