Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将$a>$b是否曾使用整数数组中断usort()?_Php_Sorting - Fatal编程技术网

Php 将$a>$b是否曾使用整数数组中断usort()?

Php 将$a>$b是否曾使用整数数组中断usort()?,php,sorting,Php,Sorting,在几乎所有的usort()示例中,逻辑似乎都是应该返回-1、0或1,这使得新的spaceship操作符非常理想。在php7之前,最基本的示例如下: usort($arr, function($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } 这种情况会发生吗?如果会,在什么条件下 我还阅读了上述两种方法的比较结果,我不明白为什么建议的方法会返回不同的结果。在usort

在几乎所有的
usort()
示例中,逻辑似乎都是应该返回-1、0或1,这使得新的spaceship操作符非常理想。在php7之前,最基本的示例如下:

usort($arr, function($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
这种情况会发生吗?如果会,在什么条件下


我还阅读了上述两种方法的比较结果,我不明白为什么建议的方法会返回不同的结果。

usort
中使用的当前排序实现可以在这里找到:

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

while (cmp(pivot, i) > 0) {
如果php核心团队出于某种原因将实现更改为使用
==0
<0
,那么您的解决方案将崩溃(因为它不会区分这些情况)

考虑到文档中没有关于如何实现排序的声明——可以安全地假设每个不遵循协议的函数都是不正确的,并且不能保证工作

一般来说,对于不稳定的排序,“a是否大于b”就足够了。一些编程语言/库使用它。在Go中,您只需要实现一个简单的
Less
函数,该函数返回一个布尔值 返回$a>$b; 等于 如果($a>$b)返回1;否则返回0; 因为除integer之外的任何返回类型都将强制转换为integer值。 以最简单的方式,代码只提供升序。
如果使用最快的算法实现usort,则此代码可能会故意失败。在此之前,我认为usort将每个元素与所有其他元素进行比较,ASC订单只需[0,1],DESC订单只需[0,-1]。

返回$a>$b返回一个布尔值,而不是一个数字。我知道,但它会改变排序行为吗?曾经吗?这取决于
usort
的实际实现。如果它只依赖于不平等性(其更大的价值),它就会起作用。如果它使用平等或更少的不平等,它将被打破。鉴于
usort
文档不能保证一个或另一个实现,可以安全地假设
返回$a>$b实现无效。@zerkms根据文档,返回
0
将不会导致任何排序操作-据我所知,这适用于
usort()
的所有实现。如果是这种情况,它什么时候会对数组进行不同的排序?我想我明白你的意思,但它仍然不能回答我的问题。
$a>$b
何时、如何以及在什么条件下产生不同的结果?如果您希望简化逻辑并仍然遵守规则,可以使用
返回$a-$b
。只有结果的符号是重要的,它不一定是明确的
-1
1
while (cmp(pivot, i) > 0) {