Usort'u php'de bir sınıf özel işlevi ile kullanma


119

tamam usort'u bir işlevle kullanmak o kadar karmaşık değil

Doğrusal kodumda daha önce sahip olduğum şey buydu

function merchantSort($a,$b){
    return ....// stuff;
}

$array = array('..','..','..');

sıralamak için basitçe yaparım

usort($array,"merchantSort");

Şimdi kodu yükseltiyoruz ve tüm genel işlevleri kaldırıp uygun yerlerine yerleştiriyoruz. Artık tüm kod bir sınıfta ve diziyi basit bir işlev yerine bir nesne yöntemi olan bir parametreyle sıralamak için usort işlevini nasıl kullanacağımı çözemiyorum

class ClassName {
   ...

   private function merchantSort($a,$b) {
       return ...// the sort
   }

   public function doSomeWork() {
   ...
       $array = $this->someThingThatReturnAnArray();
       usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out
   ...

   }
}

Soru, usort () işlevi içinde bir nesne yöntemini nasıl çağırırım

Yanıtlar:


228

Sıralama işlevinizi statik yapın:

private static function merchantSort($a,$b) {
       return ...// the sort
}

Ve ikinci parametre için bir dizi kullanın:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));

2
Bu harika! Ayrıca sort işlevinin örtük olarak statik bir yöntem olarak bildirilmesi gerekmediğini belirtmek isterim ; hala çalışmadığı için :)
Jimbo

@Jimbo - bu mantıklıdır, böylece özel işlev somutlaştırma ve sınıf değişkenlerini kullanabilir. Evet, bu harika! Ayrıca, geçebileceğiniz yer olan @deceze cevabına bakın $this(neato).
Ben

5
Fonksiyonu statik yaparsanız (ki yapmalısınız), sadece yazabilirsiniz usort($array, 'ClassName:merchantSort'), değil mi?
gak

8
Adamım, bunu yapmanın çok tuhaf bir yolu gibi görünüyor. Oh PHP, seni ne kadar seviyoruz.
dudewad

12
@MarcoW., Sanırım ClassName ve merchantSort arasında ikinci bir ':' eksik. Ayrıca, işlev aynı sınıfın içinde kullanılıyorsa, onunla test ettim 'self::merchantSort've çalışıyor.
Pere


21

$thisÖrneğin geçmeniz gerekiyor :usort( $myArray, array( $this, 'mySort' ) );

Tam örnek:

class SimpleClass
{                       
    function getArray( $a ) {       
        usort( $a, array( $this, 'nameSort' ) ); // pass $this for scope
        return $a;
    }                 

    private function nameSort( $a, $b )
    {
        return strcmp( $a, $b );
    }              

}

$a = ['c','a','b']; 
$sc = new SimpleClass();
print_r( $sc->getArray( $a ) );

İkinci bölüm artık çok daha iyi. Ancak ilk örneğinizde hala ")" eksik.
codescribblr

5

Bu örnekte, AverageVote adlı dizinin içindeki bir alana göre sıralama yapıyorum.

Yöntemi çağrının içine dahil edebilirsiniz, yani artık sınıf kapsamı probleminiz yok, bunun gibi ...

        usort($firstArray, function ($a, $b) {
           if ($a['AverageVote'] == $b['AverageVote']) {
               return 0;
           }

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });

1
Bu, yalnızca bu işlevi yalnızca bu türden kullanıyorsanız anlamlıdır. Çoğu durumda aynı karşılaştırma birçok yerde kullanılır.
ipek

1
Bu, yapmam gereken şey için mükemmeldi. Teşekkürler!
Christopher Smit

3

Laravel (5.6) model sınıfında bunu şöyle adlandırdım, her iki yöntem de public static, windows 64 bit üzerinde php 7.2 kullanıyor.

public static function usortCalledFrom() 

public static function myFunction()

UsortCalledFrom () 'ı böyle aradım

usort($array,"static::myFunction")

Bunların hiçbiri işe yaramadı

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")

static::sınıf adı yerine ihtiyacım olan şeydi, bahsettiğin için teşekkürler.
Samimi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.