PHP 7以降
PHP 7以降、これは、要素を比較するために宇宙船演算子を使用usort
する匿名関数を使用して簡潔に行うことができます。
次のように昇順で並べ替えることができます。
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
または、次のような降順ソート:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
これがどのように機能するかを理解するためにusort
、はユーザー提供の比較関数を使用することに注意してください。比較関数は(ドキュメントから)次のように動作する必要があります。
最初の引数がそれぞれ2番目の引数より小さい、等しい、または大きいと見なされる場合、比較関数はゼロより小さい、等しい、またはより大きい整数を返す必要があります。
また<=>
、宇宙船のオペレーターである
両方のオペランドが等しい場合は0を返し、左が大きい場合は1を返し、右が大きい場合は-1を返します
これはまさにusort
必要なものです。実際、https://wiki.php.net/rfc/combined-comparison-operator<=>
の言語に追加することで与えられる正当化のほとんどすべては、
で使用するための順序付けコールバックの記述をusort()
簡単にします
PHP 5.3以降
PHP 5.3は匿名関数を導入しましたが、まだ宇宙船演算子はありません。usort
配列をソートするために引き続き使用できますが、少し冗長で理解が難しくなります。
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
整数値を扱うコンパレータがちょうど値の差を返すようにするために、それはかなり一般的ですが、のようなことに注意$item2['price'] - $item1['price']
、我々はできません安全に、この場合のことを行います。これは、質問の質問者の例では価格が浮動小数点数であるためです。ただし、渡される比較関数は、適切に機能usort
するためusort
に整数を返す必要があります。
戻り非整数、フロートとして、比較関数の値を、コールバック関数の戻り値の整数の内部キャストをもたらすであろう。したがって、0.99や0.1などの値はどちらも0の整数値にキャストされ、これらの値は等しいと比較されます。
これは、usort
PHP 5.xで使用する際に留意すべき重要なトラップです。この回答の私の元のバージョンはこの間違いを犯しましたが、重大なバグに誰も気付かずに、何千ものビューに対して10の賛成票を獲得したようです。私のようなウィットウィットがコンパレーター機能を台無しにしてしまうことが容易であることが、PHP 7の言語に使いやすい宇宙船オペレーターが追加された理由です。