php - 为什么 usort (php) 即使不返回整数也能工作?

标签 php sorting usort php-internals

昨天在工作中我偶然发现了一段代码,大致如下:

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/

相关文章:

php - 在 PHP 中向变量输入字符串

javascript - 在我的例子中如何使用 php 传递参数

php - 可以在 PHP 中将闭包传递给 usort 吗?

PHP MySQL 并发

php - 在 include 中设置 Twig 变量并在之后使用它

java - 如何根据每个数据项的位置建立一个ArrayList

多维数组上的java比较器

javascript - 在由不同颜色的立方体组成的网格中,如何找到匹配的簇?

PHP的USORT回调函数参数

PHP:奇怪的 usort 错误