Temel tek boyutlu diziler
$array = array(3, 5, 2, 8);
Uygulanabilir sıralama fonksiyonları:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
Bunlar arasındaki fark sadece anahtar / değer ilişkilendirmelerinin tutulması (" a
" işlevleri), alçaktan yükseğe veya tersine (" r
") sıralanması, değerleri veya anahtarları (" k
") sıralayıp sıralamaması ve değerleri nasıl karşılaştırmasıdır. (" nat
" - normal). Genel bir bakış ve daha fazla ayrıntı için bağlantılar için http://php.net/manual/en/array.sorting.php adresine bakın.
Nesne dizileri dahil çok boyutlu diziler
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
$array
Her girişin 'foo' anahtarına göre sıralamak isterseniz , özel bir karşılaştırma işlevine ihtiyacınız vardır . Yukarıdaki sort
ve ilgili işlevler, karşılaştırmayı ve sıralamayı bildikleri basit değerler üzerinde çalışır. PHP gibi karmaşık bir değer ile ne yapacağını basitçe "bilmek" değildir array('foo' => 'bar', 'baz' => 42)
; bu yüzden söylemelisin.
Bunu yapmak için bir karşılaştırma işlevi oluşturmanız gerekir . Bu işlev iki öğe alır ve 0
bu öğeler eşit kabul 0
edilirse, ilk değerin daha düşük bir değerden 0
ve ilk değerin daha yüksek bir değerden daha yüksek bir değerden dönmesi gerekir . Tek gereken bu:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
Genellikle, geri arama olarak anonim bir işlev kullanmak istersiniz . Bir yöntem veya statik yöntem kullanmak istiyorsanız , PHP'de geri arama belirtmenin diğer yollarına bakın .
Daha sonra şu işlevlerden birini kullanırsınız:
Yine, yalnızca anahtar / değer ilişkilendirmelerini tutma ve değerlere veya anahtarlara göre sıralama yapmalarına göre farklılık gösterirler. Ayrıntılar için belgelerini okuyun.
Örnek kullanım:
usort($array, 'cmp');
usort
diziden iki öğe alır ve cmp
işlevinizi bunlarla çağırır . Yani cmp()
birlikte adı verilecek $a
şekilde array('foo' => 'bar', 'baz' => 42)
ve $b
başka şekilde array('foo' => ..., 'baz' => ...)
. İşlev daha sonra usort
değerlerden hangisinin daha büyük olduğuna veya eşit olup olmadıklarına döner . usort
için farklı değerler geçen bu işlemi tekrarlar $a
ve $b
dizi kriteri kadar. cmp
Fonksiyonu, birçok kez adı verilecek en azından değerler olduğu gibi çok kez $array
farklı ait değerlerin kombinasyonları ile, $a
ve $b
her zaman.
Bu fikre alışmak için şunu deneyin:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
Tek yaptığınız, iki öğeyi karşılaştırmak için özel bir yol tanımlamaktı. Bu her türlü değerle çalışır.
Bu arada, bu herhangi bir değer üzerinde çalışır, değerlerin karmaşık diziler olması gerekmez. Yapmak istediğiniz özel bir karşılaştırmanız varsa, bunu basit bir sayı dizisinde de yapabilirsiniz.
sort
referans ile sıralar ve yararlı bir şey döndürmez!
Dizinin yerinde sıralandığını, dönüş değerini hiçbir şeye atamanıza gerek olmadığını unutmayın. $array = sort($array)
diziyi true
, sıralı bir diziyle değil, ile değiştirir . Sadece sort($array);
çalışıyor.
Özel sayısal karşılaştırmalar
baz
Sayısal tuşa göre sıralamak istiyorsanız , tek yapmanız gereken:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
Sayesinde matematik güç değeri <0, 0 veya> 0 olmasına bağlı olarak, bu döner $a
daha düşüktür, veya daha büyük eşit $b
.
Bunun float
değerlerde iyi sonuç vermeyeceğini unutmayın , çünkü bunlar bir değere indirilecek int
ve hassasiyeti kaybedecektir. Açık kullanın -1
, 0
ve 1
bunun yerine değerleri döndürür.
Nesneler
Bir dizi nesneniz varsa, aynı şekilde çalışır:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
Fonksiyonlar
Arama işlevleri de dahil olmak üzere bir karşılaştırma işlevi içinde ihtiyacınız olan her şeyi yapabilirsiniz:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
Teller
İlk dize karşılaştırma sürümü için bir kısayol:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
tam olarak bekleneni vermez neyi cmp
burada, döndürür -1
, 0
veya 1
.
Uzay gemisi operatörü
PHP 7 , türler arasındaki karşılaştırmalardan eşit / daha küçük / daha büyük olanı birleştiren ve basitleştiren uzay gemisi operatörünü tanıttı :
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
Birden çok alana göre sıralama
Öncelikle sıralama yapmak istiyorsanız foo
, ancak foo
iki öğe için eşitse sıralama ölçütü baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
Tanıdık olanlar için, bu bir SQL sorgusuna eşdeğerdir ORDER BY foo, baz
.
Ayrıca bu çok düzgün steno versiyonuna ve rastgele sayıda anahtar için böyle bir karşılaştırma fonksiyonunun nasıl oluşturulacağına bakın .
Manuel, statik bir sıraya göre sıralama
Elemanları "foo", "bar", "baz" gibi bir "manuel sipariş" olarak sıralamak istiyorsanız :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
Yukarıdakilerin tümü için, PHP 5.3 veya üstünü kullanıyorsanız (ve gerçekten yapmalısınız), daha kısa kod için anonim işlevler kullanın ve etrafta başka bir küresel işlevin olmasını önlemek için:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
Karmaşık çok boyutlu bir diziyi sıralamak bu kadar basit olabilir. Yine, sadece PHP'ye iki öğeden hangisinin "daha büyük" olduğunu söylemeyi öğretmeyi düşünün ; PHP gerçek sıralama yapalım.
Ayrıca, yukarıdakilerin tümü için, artan ve azalan düzen arasında geçiş yapmak için $a
ve $b
argümanlarını değiştirin . Örneğin:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
Bir diziyi diğerine göre sıralama
Ve bir tuhaflık var array_multisort
, bu da bir diziyi diğerine göre sıralamanızı sağlar:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
Burada beklenen sonuç:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
array_multisort
Oraya ulaşmak için kullanın :
array_multisort($array1, $array2);
PHP 5.5.0'dan array_column
itibaren bir sütunu çok boyutlu bir diziden ayıklamak ve diziyi bu sütundaki sıralamak için kullanabilirsiniz:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
PHP 7.0.0'dan itibaren, bir nesne dizisinden özellikleri ayıklayabilirsiniz.
Daha sık karşılaşılan vakalarınız varsa, bu yanıtı düzenlemekten çekinmeyin.