Menu

PHP Dizi Sıralama: sort(), usort(), asort() ve ksort()

sort($array) bir listeyi yerinde sıralar, asort ve ksort ilişkisel bir diziyi değere veya anahtara göre sıralar, usort ise kendi karşılaştırmanızla sıralar. Hepsini öğrenin, çok boyutlu bir diziyi bir sütuna göre sıralayın ve klasik $sorted = sort($arr) hatasından kaçının.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

sort($array) bir diziyi artan sırada, yerinde sıralar. Verdiğiniz değişkeni değiştirir ve true döndürür, bu yüzden onu kendi satırında çağırır ve ardından diziyi kullanırsınız. rsort() azalan sırada sıralar.

PHP'de "değere veya anahtara göre", "artan veya azalan" ve "anahtarları koru veya koruma" kombinasyonlarının her biri için bir sıralama fonksiyonu vardır:

FonksiyonNeye göre sıralarSıraAnahtarlar
sortdeğerartan0, 1, 2 olarak yeniden numaralanır
rsortdeğerazalanyeniden numaralanır
asortdeğerartankorunur
arsortdeğerazalankorunur
ksortanahtarartankorunur
krsortanahtarazalankorunur
usortsizin fonksiyonunuzsizin seçiminizyeniden numaralanır
uasortsizin fonksiyonunuzsizin seçiminizkorunur
uksortanahtarlar üzerinde sizin fonksiyonunuzsizin seçiminizkorunur

İlişkisel bir diziyi değere göre sıralama

İlişkisel bir dizide sort() anahtarları atar. Değere göre sıralayıp her anahtarı değeriyle tutmak için asort(), en yüksekten başlamak için arsort() kullanın.

ksort ile bir diziyi anahtara göre sıralama

ksort() anahtara göre, krsort() anahtara göre ters sıralar. Ayarları yazdırmadan veya bir sorgu dizgesini sabit bir sırada oluşturmadan önce kullanışlıdır.

usort ve uzay gemisi operatörüyle özel sıralama

usort($array, $callback) sırayı sizin belirlemenizi sağlar. Geri çağırma iki eleman alır; ilki önce gelmeliyse negatif bir sayı, ikincisi önce gelmeliyse pozitif bir sayı, eşitlerse 0 döndürür. Uzay gemisi operatörü <=> tam olarak bunu döndürür.

banana ve cherry aynı uzunluktadır, bu yüzden geri çağırma onlar için 0 döndürür ve zaten sahip oldukları sırada kalırlar. PHP'nin sıralaması PHP 8.0'dan beri kararlıdır: eşit elemanlar önceki sıralarını korur.

Çok boyutlu bir diziyi bir değere göre sıralama

Bir satır listesini tek bir alana göre sıralamak için usort içinde o alanı karşılaştırın. İki alana göre sıralamak için dizileri karşılaştırın: <=> onları eleman eleman karşılaştırır, bu yüzden ikinci alan yalnızca birincideki eşitlikleri çözer.

İkinci karşılaştırma $b["age"] değerini sol tarafa, $a["age"] değerini sağ tarafa koyar; bu yalnızca yaş sırasını tersine çevirir. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) aynı sırayı geri çağırma olmadan verir: çıkarılan sütunlara göre sıralar ve $people dizisini buna göre yeniden düzenler.

Doğal sıra ve sıralama bayrakları

Varsayılan olarak PHP sayıları sayı, dizgeleri dizge olarak karşılaştırır. İçinde sayı olan dosya adları insanların beklemediği şekilde sıralanır: img10 img2 değerinden önce gelir ve her büyük harfli isim her küçük harfli isimden önce gelir. Bayraklar değerlerin nasıl karşılaştırılacağını değiştirir.

SORT_NATURAL rakam dizilerini sayı olarak okur, SORT_FLAG_CASE büyük küçük harfi yok sayar ve SORT_STRING sayısal dizgeler için bile karakter karakter karşılaştırmayı zorunlu kılar. natsort() ve natcasesort() aynı fikirdir ama anahtarları korur.

Sık yapılan hata: sort sonucunu atamak

Her sıralama fonksiyonu true döndürür ve verdiğiniz diziyi değiştirir. Dönüş değerini atamak diziyi kaybettirir:

Sıralanmış bir kopyaya ihtiyacınız varsa ve orijinali korumak istiyorsanız, yukarıdaki asort örneğinin $copy ile yaptığı gibi diziyi önce yeni bir değişkene kopyalayın ve kopyayı sıralayın.

Sıkça Sorulan Sorular

sort() neden sıralanmış dizi yerine true döndürüyor?

PHP'nin sıralama fonksiyonları diziyi bir referans üzerinden yerinde sıralar ve true döndürür. sort($arr); ifadesini kendi satırında çağırın ve ardından $arr kullanın. $arr = sort($arr); yazmak dizinizi true ile değiştirir.

İlişkisel bir diziyi anahtarları koruyarak değere göre nasıl sıralarım?

Artan sıra için asort($arr), azalan sıra için arsort($arr) kullanın. sort() ve rsort() da değere göre sıralar ama anahtarları atar ve 0'dan yeniden numaralar.

PHP'de çok boyutlu bir diziyi bir değere göre nasıl sıralarım?

Alan üzerinde uzay gemisi operatörüyle usort kullanın: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Azalan sıra için $a ve $b yerini değiştirin; iki alana göre sıralamak için [$a['city'], $a['age']] <=> [$b['city'], $b['age']] gibi dizileri karşılaştırın.

PHP sıralaması kararlı mı?

Evet, PHP 8.0'dan beri her sıralama fonksiyonu kararlıdır: eşit sayılan elemanlar sıralamadan önceki sıralarını korur. Önce bir alana, sonra başka bir alana göre sıralamanın beklendiği gibi çalışmasını sağlayan budur.

Sayı içeren dizgeleri doğal sırada nasıl sıralarım?

img2 değerini img10 değerinden önce koyan natsort($arr) veya sort($arr, SORT_NATURAL) kullanın. Büyük küçük harfi yok saymak için SORT_FLAG_CASE ekleyin (SORT_NATURAL | SORT_FLAG_CASE) ya da natcasesort kullanın.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA