【发布时间】:2020-05-11 11:23:22
【问题描述】:
昨天在工作中偶然发现了一段代码,大致是这样的:
uasort($array, function($a, $b) {
return isset($a['sort_code']) && isset($b['sort_code']) && $a['sort_code'] > $b['sort_code'];
});
这在我的脑海中翻转了几个开关,因为这只能返回布尔值 true 或 false,而不是 php.net 中明确说明的 0 1 或 -1。最佳情况下,PHP 会将 false 解释为 0,将 true 解释为 1。所以一个人(写这篇文章的同事)可能会争辩说它确实有效。
我认为它不可能工作,因为它永远不会返回 -1。排序回调中的此 return-either-true-or-false 中缺少一个状态,我认为这是您将得到错误结果或过程性能不佳的方式。
我实际上开始编写几个测试,虽然我不是排序方面的专家,但我实际上已经达到了你可以真正取消 -1 状态并仍然通过相同数量的计算得到正确排序的地步
实际上你可以替换:
if ($a === $b) {
return 0;
}
return $a < $b ? -1 : 1;
与
return $a > $b;
现在,正如我所说,我绝不是排序方面的专家,我的测试也不够彻底。然而,我对小型和大型阵列的结果表明这是真的。使用任何一种方法,数组总是得到正确排序,计算量相同
所以说没有第三态(-1)似乎真的没什么大不了的
我仍然坚持我的观点,即您应该严格遵守文档,尤其是 PHP。当 php 说我需要 0、负数或正数时,这正是我们应该做的。你不应该把这样的事情留给偶然的机会,看看事情是如何运作的。
但是我对这一切很感兴趣,希望了解更多的人提供一些见解
想法?有人吗?
【问题讨论】:
-
你总是可以使用宇宙飞船运算符 - stackoverflow.com/questions/30365346/…
-
我相信我已经偶然发现了一些不遵循规范提供错误结果的情况,但我现在找不到。在任何情况下,如果 PHP 团队决定在后台调整排序算法,如果不遵循手册,您将面临代码在未来版本中不再正确排序的风险。
-
Same question for Javascript。简而言之:这完全取决于其背后的算法。出于上述原因,我会遵循规范。
标签: php sorting usort php-internals