Verwenden von usort in PHP mit einer Klasse private Funktion

119

ok usort mit einer funktion zu benutzen ist nicht so kompliziert

Das hatte ich vorher in meinem linearen Code

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

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

zu sortieren mache ich einfach

usort($array,"merchantSort");

Jetzt aktualisieren wir den Code, entfernen alle globalen Funktionen und platzieren sie an der richtigen Stelle. Jetzt ist der gesamte Code in einer Klasse und ich kann nicht herausfinden, wie die usort-Funktion verwendet wird, um das Array mit dem Parameter zu sortieren, der eine Objektmethode anstelle einer einfachen Funktion ist

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

   }
}

Die Frage ist, wie ich eine Objektmethode innerhalb der Funktion usort () aufrufe

Ibu
quelle

Antworten:

228

Machen Sie Ihre Sortierfunktion statisch:

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

Und verwenden Sie ein Array für den zweiten Parameter:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
Demian Brecht
quelle
2
Das ist toll! Ich möchte auch darauf hinweisen, dass die Sortierfunktion nicht implizit als statische Methode deklariert werden muss. da es immer noch ohne funktioniert :)
Jimbo
@Jimbo - das ist sinnvoll, damit die private Funktion Instanziierungs- und Klassenvariablen verwenden kann. Ja, das ist großartig! Siehe auch @deceze Antwort, wo Sie übergeben können $this(ordentlich).
Ben
5
Wenn Sie die Funktion statisch machen (was Sie sollten), können Sie einfach schreiben usort($array, 'ClassName:merchantSort'), nicht wahr?
Caw
8
Mann, das scheint so eine seltsame Art zu sein, dies zu tun. Oh PHP, wie sehr wir dich lieben.
Dudewad
12
@MarcoW., Ich denke, zwischen ClassName und MerchantSort fehlt ein zweites ':'. Wenn die Funktion in derselben Klasse selbst verwendet wird, habe ich sie getestet 'self::merchantSort'und sie funktioniert.
Pere
21

Sie müssen $thiszB bestehen:usort( $myArray, array( $this, 'mySort' ) );

Vollständiges Beispiel:

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
quelle
Der zweite Abschnitt ist jetzt viel besser. In Ihrem ersten Beispiel fehlt jedoch noch ")".
Codescribblr
4

In diesem Beispiel sortiere ich nach einem Feld innerhalb des Arrays namens AverageVote.

Sie können die Methode in den Aufruf aufnehmen, was bedeutet, dass Sie das Klassenbereichsproblem wie folgt nicht mehr haben ...

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

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });
James K.
quelle
1
Das ist nur dann sinnvoll, wenn Sie diese Funktion nur in dieser einen Art verwenden. In vielen Fällen wird an vielen Stellen der gleiche Vergleich verwendet.
Seide
3

In der Modellklasse Laravel (5.6) habe ich es so genannt. Beide Methoden sind öffentlich statisch und verwenden PHP 7.2 unter Windows 64 Bit.

public static function usortCalledFrom() 

public static function myFunction()

Ich habe usortCalledFrom () so aufgerufen

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

Nichts davon war Arbeit

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
hrnsky
quelle
static::Anstelle des Klassennamens brauchte ich, danke, dass ich ihn erwähnt habe.
Aufrichtig