PHP中是否有简单的usort函数?

5
在PHP中,usort函数需要两个参数:要排序的数组和一个回调函数。回调函数也需要两个参数:$a和$b。然后,我们可以按照任何方式比较这两个参数。令人惊讶的是,这种使用usort的情况并不太常见。通常我们会按照相同的属性或使用相同的逻辑来对$a和$b进行排序。例如,如果我们想按长度排序:
$animals = ['dog', 'tiger', 'giraffe', 'bear'];

usort($animals, function ($a, $b) {
    return strlen($a) - strlen($b);
});

那样也可以,但我们需要两次使用 strlen。更好的方法是这样说:
usort($animals, function ($element) {
    return strlen($element);
});

甚至可以像这样:
usort($animals, 'strlen');

我曾经亲自编写过这种函数(使用了PHP 7的新功能,但很容易改为PHP 5):

function simple_usort(array &$array, callable $callback): bool
{
    return usort($array, function ($a, $b) use ($callback) {
        return $callback($a) <=> $callback($b);
    });
}

它运行得很完美,但是PHP中是否已经有其他函数内置了它?如果没有,为什么PHP不支持这种非常流行和方便的排序方式?


3
最后一部分,你可能需要询问 PHP 群组而不是我们…哈哈 - Andrew
然而,您可以编写自己的“特殊”通用回调函数,而无需使用PHP7中的太空船操作符,只需使用以下代码:function simple_usort(array &$array, callable $callback) { return usort($array, function ($a, $b) use ($callback) { return $callback($a) - $callback($b); }); } - Mark Baker
因为它既不流行也不方便。而流行且方便的是现有的 usort() 功能,您可以使用它来实现自己的排序函数,无论这些函数是否明智或奇特,就像您已经在这里做的一样。 - Sammitch
@MarkBaker 我的函数正在执行与usort相同的操作,而不仅仅是返回信息。 - Robo Robok
@MarkBaker,我还是不明白你的观点。它返回将用于排序和比较的信息片段。这有什么问题吗?在我看来,在大多数情况下,与在函数中显式比较$a和$b相比,这样做更有意义。 - Robo Robok
显示剩余8条评论
2个回答

2

它运行得很完美,但是在PHP中是否已经内置了其他功能?

没有。

如果没有,为什么PHP不支持这种非常流行和方便的排序方式?

一门语言应该被设计成提供通用工具来完成任务,而不是提供大量函数来迎合某些可能不受欢迎的使用情况,即使这种决定不会对性能产生负面影响。


PHP提供的函数比我提到的那个要多得多。在PHP中,数组本身就有大量内置函数,其中一些根本不是通用的。 - Robo Robok
@RoboRobok 是的,我小心地省略了 PHP 违反一些语言设计最佳实践的部分。;-) - Ja͢ck

0
简单回答:因为没有人请求并且没有人实现它。
PHP 是由有补丁的人或者是激励他人编写补丁的人推动的。如果一个功能对任何人都不是很有趣,那么就不会被请求和实现。
我认为你想要的功能太过具体,而且收益太小。
但如果你需要它的话:通过 bugs.php.net 添加一个功能请求或通过 github 提出一个补丁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接