PHP 7+
PHP 7 itibaren bu kısaca kullanılarak yapılabilir usort
bir ile anonim fonksiyonu kullanan uzay gemisi operatörü eleman karşılaştırmak.
Bunun gibi artan bir sıralama yapabilirsiniz:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Veya bunun gibi azalan bir sıralama:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Bunun nasıl çalıştığını anlamak için, usort
aşağıdaki gibi davranması gereken kullanıcı tarafından sağlanan bir karşılaştırma işlevini aldığını unutmayın (dokümanlardan):
İlk bağımsız değişken, ikinciden sırasıyla küçük, eşit veya büyük olarak kabul edilirse karşılaştırma işlevi sıfırdan küçük, eşit veya sıfırdan büyük bir tamsayı döndürmelidir.
Ve ayrıca <=>
, uzay gemisi operatörünün,
her iki işlenen eşitse 0, sol büyükse 1 ve sağ büyükse -1 döndürür
tam da neye usort
ihtiyacı var. Aslında, neredeyse eklemek için verilen tüm gerekçesi <=>
de dile https://wiki.php.net/rfc/combined-comparison-operator öyle mi
ile kullanmak için yazma sipariş geri çağrıları usort()
kolaylaştırır
PHP 5.3 ve üstü
PHP 5.3 anonim işlevler getirdi, ancak henüz uzay gemisi operatörü yok. usort
Dizimizi sıralamak için hala kullanabiliriz , ancak biraz daha ayrıntılı ve anlaşılması daha zor:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Not sadece değerlerin farkını dönmek için tamsayı değerleri ile uğraşan Karşılaştırıcıların için oldukça yaygın bir kullanımdır gibi o $item2['price'] - $item1['price']
, biz olamaz güvenli bir biçimde yapmanın bu durumda. Bunun nedeni, fiyatların soru sorucunun örneğindeki kayan nokta sayılarıdır, ancak geçirdiğimiz karşılaştırma işlevinin düzgün çalışması usort
için tamsayılar döndürmesi usort
gerekir:
Geri dönen tamsayı olmayan örneğin kayan nokta olarak, karşılaştırma fonksiyonunun değerleri, geri dönüş değeri tam sayı için bir iç döküm neden olur. Dolayısıyla, 0,99 ve 0,1 gibi değerlerin her ikisi de, 0 gibi bir tamsayı değerine dönüştürülür ve bu değerler eşit olarak karşılaştırılır.
Bu usort
PHP 5.x kullanırken akılda tutulması gereken önemli bir tuzaktır ! Bu cevabın orijinal versiyonum bu hatayı yaptı ve yine de ciddi bir hatayı fark etmeden görünüşe göre binlerce görüşe on upvot aldım. Beni karşılaştırıcı fonksiyonları berbat edebilir gibi kolaylığı hangi ile lackwits kesin kolay kullanımlı uzay gemisi operatörü PHP 7'de dile eklendiği sebep.