Menggunakan usort di php dengan fungsi privat kelas

119

ok menggunakan usort dengan fungsi tidak begitu rumit

Ini adalah apa yang saya miliki sebelumnya dalam kode linier saya

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

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

untuk mengurutkan saya cukup lakukan

usort($array,"merchantSort");

Sekarang kami meningkatkan kode dan menghapus semua fungsi global dan menempatkannya di tempat yang sesuai. Sekarang semua kode ada di kelas dan saya tidak tahu bagaimana menggunakan fungsi usort untuk mengurutkan array dengan parameter yang merupakan metode objek daripada fungsi sederhana

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
   ...

   }
}

Pertanyaannya adalah bagaimana cara memanggil metode objek di dalam fungsi usort ()

Ibu
sumber

Jawaban:

228

Jadikan fungsi sortir Anda statis:

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

Dan gunakan array untuk parameter kedua:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
Demian Brecht
sumber
2
Ini bagus! Saya juga ingin menunjukkan bahwa fungsi sortir tidak harus dideklarasikan secara implisit sebagai metode statis; karena masih berfungsi tanpa :)
Jimbo
@Jimbo - itu masuk akal, sehingga fungsi private bisa menggunakan variabel instantiation dan class. Ya, ini bagus! Juga lihat jawaban @deceze, di mana Anda bisa lulus $this(neato).
Ben
5
Jika Anda membuat fungsi statis (yang seharusnya), Anda bisa menulis saja usort($array, 'ClassName:merchantSort'), bukan?
gak
8
Astaga, ini sepertinya cara yang aneh untuk melakukan ini. Oh PHP, betapa kami mencintaimu.
dudewad
12
@MarcoW., Saya pikir ada ':' kedua yang hilang antara ClassName dan merchantSort. Selain itu, jika fungsi tersebut digunakan di dalam kelas yang sama itu sendiri, saya telah mengujinya 'self::merchantSort'dan berfungsi.
Pere
21

Anda harus lulus $thismisalnya:usort( $myArray, array( $this, 'mySort' ) );

Contoh lengkap:

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 ) );
Justin
sumber
Bagian kedua sekarang jauh lebih baik. Tapi Anda masih kehilangan ")" di contoh pertama Anda.
Codescribblr
5

Dalam contoh ini saya mengurutkan berdasarkan bidang di dalam array yang disebut AverageVote.

Anda dapat menyertakan metode di dalam panggilan, yang berarti Anda tidak lagi memiliki masalah cakupan kelas, seperti ini ...

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

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });
James K
sumber
1
Itu masuk akal hanya jika Anda menggunakan fungsi ini hanya dalam satu jenis ini. Dalam banyak kasus, perbandingan yang sama digunakan di banyak tempat.
sutra
1
Ini sempurna untuk apa yang perlu saya lakukan. Terima kasih!
Christopher Smit
3

Di kelas model Laravel (5.6), saya menyebutnya seperti ini, kedua metode tersebut adalah public static, menggunakan php 7.2 pada windows 64 bit.

public static function usortCalledFrom() 

public static function myFunction()

Saya memang memanggil usortCalledFrom () seperti ini

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

Tak satu pun dari ini adalah pekerjaan

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
hrnsky
sumber
static::alih-alih nama kelas yang saya butuhkan, terima kasih telah menyebutkannya.
Tulus