PHP'nin usort Geri Fonksiyon Parametreleri

2 Cevap php

Bu gerçekten ezoterik bir soru, ama ben gerçekten merak ediyorum. Yıllardır, bugün ilk kez usort kullanıyorum, ve ben tam olarak ne oluyor, özellikle ilgileniyorum. Ben şu diziyi var varsayalım:

$myArray = array(1, 9, 18, 12, 56);

Ben usort ile bu sıralamak:

usort($myArray, function($a, $b){
  if ($a == $b) return 0;
  return ($a < $b) ? -1 : 1;
});

Ben iki parametre $ a ve $ b ile ne olup bittiğini hakkında net% 100 değilim. Ne olduklarını ve onlar neyi temsil ediyor. Yani, $ bir dizi geçerli öğeyi temsil ettiğini varsayalım, ama bu tam olarak ne göre oluyor? $ B nedir?

Ben dizeler içerecek benim dizi artırabilir:

$myArray = array(
  array("Apples", 10),
  array("Oranges", 12),
  array("Strawberries", 3)
);

Ve aşağıdaki çalıştırın:

usort($myArray, function($a, $b){
  return strcmp($a[0], $b[0]);
});

Ve bu alfabetik [0] endeks değerine göre Çocuğumun-dizileri sıralamak istiyorum. Ama bu a ve $ b $ olan ne hakkında herhangi bir netlik sunmuyor. Ben sadece bilmek maç I arayan kulüpler desen ki.

Birileri gerçekten gerçekleşiyor ne hakkında bazı netlik sunabilir miyim?

2 Cevap

Iki öğe karşılaştırmak ve bir diğer önce gelirse anlamaya bir vasıta gereken bir şey sıralamak için. Bu usort tedarik budur. Bu fonksiyon girdi dizisindeki iki öğe geçti ve onlar içeri olmalıdır sırasını döndürür olacak

Iki öğe karşılaştırmak için bir araç var, kullanabilirsiniz sort-algorithm-of-your-choice.

Eğer alışık değilseniz, sizin gibi basit bir naif algoritma bubblesort Bir karşılaştırma işlevini kullanmak nasıl bakmak isteyebilirsiniz.

Perde arkasında, PHP quicksort kullanıyor.

$ A ve $ b tam tanımı diziyi sıralamak için kullanılan algoritma bağlıdır. Iki öğe karşılaştırmak için bir araç olması bir şey sıralamak için, bu geri çağırma işlevi için kullanılan budur. Bazı sıralama algoritmaları dizideki her yerde başlayabilir, diğerleri hiçbir fixed onlar olmak zorunda dizideki iki unsurlarıdır daha $ a ve $ b diğer anlamı var bunun belirli bir bölümünde sadece başlayabilirsiniz Geçerli algoritmasına göre karşılaştırılmıştır.

Bu yöntem, algoritma PHP kullanarak hangi ışık tutmak için kullanılabilir.

<?php

$myArray = array(1, 19, 18, 12, 56);

function compare($a, $b) {
    echo "Comparing $a to $b\n";
    if ($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

usort($myArray,"compare");
print_r($myArray);
?>

Çıktı

vinko@mithril:~$ php sort.php
Comparing 18 to 19
Comparing 56 to 18
Comparing 12 to 18
Comparing 1 to 18
Comparing 12 to 1
Comparing 56 to 19
Array
(
    [0] => 1
    [1] => 12
    [2] => 18
    [3] => 19
    [4] => 56
)

Çıkışı ve kaynak bakarak biz PHP kaynak Zend/zend_qsort.c kontrol, kullanılan sıralama gerçekten quicksort uygulamasıdır görebilirsiniz (sürüm için biraz eski ama bağlantılı ) çok değişmedi.

Böylece tüm bu dizinin ortasında pivotu alır, mil göre (kullanılmakta olan karşılaştırma işleve göre) daha az olan tüm elemanlar eksen önce gelen ve bu şekilde 18 in, o zaman listesini yeniden düzenlemek için ihtiyaç ve pivotun daha büyük elemanlar ondan sonra gel, biz ilk başta 18 için her şeyi karşılaştırır zaman bunu yaparken görebilirsiniz.

Bazıları daha şematik bir açıklama.

Step 0: (1,19,18,12,56); //Pivot: 18, 
Step 1: (1,12,18,19,56); //After the first reordering
Step 2a: (1,12);         //Recursively do the same with the lesser, here 
                         //pivot's 12, and that's what it compares next if 
                         //you check the output.
Step 2b: (19,56);        //and do the same with the greater