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) {