2015-11-26 12 views
5

PHPでは、usort関数には2つの引数があります:配列からソート、コールバックです。コールバックには、$ aと$ bの2つの引数もあります。次に、私たちが望む方法でこれら2つを比較します。 usortのこのユースケースはあまり一般的ではないので、常に私を驚かせます。通常は、値を同じプロパティでソートするか、$ aと$ bの両方で同じロジックを使用します。例えば、我々は長さによってソートする場合:PHPには単純なソートがありますか?

$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グループに質問してもいいかもしれません... lol – Andrew

+0

私は以前にusortを使ったことがありませんでした。これを見ると、私はちょっとコールバック関数に混乱しています。 $ aのstrlenは3、$ bのstrlenは5です。したがって、3-5は-2ですか? $ aと$ bをソートするには-2という数字をどのように使いますか?申し訳ありませんが、私はあなたがここで質問をしていることを知っていますが、私は非常に興味があります。 – frosty

+0

@Andrewあなたは正しいですが、私は何かを逃していないと確信しています。ここの「なぜ」というのは、「私は何かを逃していますか?」という意味です。 –

答えて

2

これは完璧に動作しますが、すでに他の機能でPHPで構築されていませんか?

ない場合は、なぜPHPは、ソートのこの非常に人気があり、便利な方法をサポートしていませんか?

言語はまたは人気があってもなくてもよい特定のユースケースに対応するために多数の機能を供給することなく、物事を成し遂げるためにジェネリックツールを提供するように設計されるべきで、その性能はマイナスの影響を受けていない付与そのような決定。

+0

まあ、PHPは、私が言及したものよりもはるかにエキゾチックな機能を提供しています。配列だけでPHPに組み込み関数がたくさんありますが、その中には一般的ではないものもあります。 –

+0

@RoboRobokええ、私は、phpがそれらの言語設計のベストプラクティスのいくつかに違反する部分を省略するように注意しました;-) –

0

単純な回答:誰もそれを要求していないので誰もそれを実装していない。

PHPは、パッチを持っている人、またはパッチを書くために他人を動かす人によって動かされます。機能が誰にとっても興味深いものではない場合、その機能は要求されておらず、実装されていません。

私が望む機能はあまりにも特殊でゲインが小さすぎると思います。

しかし、それが必要な場合:bugs.php.netから機能要求を追加するか、github経由でパッチを提案してください。

関連する問題