昨天在工作中我偶然发现了一段代码,大致如下:
uasort($array, function($a, $b) {
return isset($a['sort_code']) && isset($b['sort_code']) && $a['sort_code'] > $b['sort_code'];
});
这在我的脑海中翻转了几个开关,因为这只能返回 bool 值 true 或 false,而不是 php.net 中明确规定的 0 1 或 -1。最好的情况 PHP 会将 false 解释为 0,将 true 解释为 1。因此(写这篇文章的同事)可能会说它确实有效。
我认为它不可能工作,因为它永远不会返回 -1。排序回调中的 return-true-or-false 中缺少一个状态,我认为这样您会得到错误的结果,或者过程性能不佳。
我实际上开始编写一些测试,虽然我不是排序方面的专家,但我实际上已经达到了这样的程度:您实际上可以消除 -1 状态,并且仍然可以通过相同的计算量获得正确的排序
实际上你可以替换:
if ($a === $b) {
return 0;
}
return $a < $b ? -1 : 1;
与
return $a > $b;
现在,正如我所说,我绝不是排序方面的专家,而且我的测试也不够彻底。然而,我对小型和大型阵列的结果表明这是正确的。使用任一方法,数组总是正确排序,计算量相同
所以,没有第三种状态(-1)似乎真的没什么大不了的
我仍然坚持我的观点,您应该严格遵循文档,尤其是 PHP。当 php 说我需要 0、负数或正数时,这正是人们应该做的。您不应该让这样的事情听天由命,然后观察事情如何偶然发生。
但是我对这一切很感兴趣,并且希望了解更多信息的人提供一些见解
想法?有人吗?
最佳答案
您不必实际返回所有 -1、0 和 1 以使函数正常工作。返回 0 不会就地切换元素。您也可以返回类似 -1345 的值来充当 -1。
仅返回 0 或 1 意味着您只想将一些元素“下沉”到数组末尾,例如将所有 NULL
值放在数组末尾或开头,其他排序并不重要:
$input = ['c', 'a', null, 'b', null];
usort($input, function ($a, $b) {
return !is_null($b);
});
// 'b', 'a', 'c', null, null
var_dump($input);
在您的情况下,它对没有 sort_code
结尾的元素进行排序,并且按顺序排序 sort_code
关于php - 为什么 usort (php) 即使不返回整数也能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59908195/