Utiliser usort en php avec une fonction privée de classe

119

ok utiliser usort avec une fonction n'est pas si compliqué

C'est ce que j'avais auparavant dans mon code linéaire

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

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

pour trier je fais simplement

usort($array,"merchantSort");

Nous mettons maintenant à jour le code, supprimons toutes les fonctions globales et les mettons à leur place. Maintenant, tout le code est dans une classe et je ne peux pas comprendre comment utiliser la fonction usort pour trier le tableau avec le paramètre qui est une méthode objet au lieu d'une simple fonction

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

   }
}

La question est de savoir comment appeler une méthode objet dans la fonction usort ()

Ibu
la source

Réponses:

228

Rendez votre fonction de tri statique:

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

Et utilisez un tableau pour le deuxième paramètre:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
Demian Brecht
la source
2
C'est bien! Je tiens également à souligner que la fonction de tri n'a pas à être déclarée implicitement en tant que méthode statique; car il fonctionne toujours sans :)
Jimbo
@Jimbo - cela a du sens, donc la fonction privée peut utiliser l'instanciation et les variables de classe. Oui, c'est génial! Voir également @deceze answer, où vous pouvez passer $this(neato).
Ben
5
Si vous rendez la fonction statique (ce que vous devriez), vous pouvez simplement écrire usort($array, 'ClassName:merchantSort'), n'est-ce pas?
caw
8
Mec, cela semble être une façon tellement étrange de faire cela. Oh PHP, comme nous vous aimons.
dudewad
12
@MarcoW., Je pense qu'il manque un second «:» entre ClassName et merchantSort. De plus, si la fonction est utilisée dans la même classe elle-même, je l'ai testée avec 'self::merchantSort'et elle fonctionne.
Pere
21

Vous devez réussir $thispar exemple:usort( $myArray, array( $this, 'mySort' ) );

Exemple complet:

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
la source
La deuxième section est maintenant bien meilleure. Mais vous avez toujours ")" manquant dans votre premier exemple.
codescribblr
5

Dans cet exemple, je trie par un champ à l'intérieur du tableau appelé AverageVote.

Vous pouvez inclure la méthode dans l'appel, ce qui signifie que vous n'avez plus le problème de portée de classe, comme ceci ...

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

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });
James K
la source
1
Cela n'a de sens que si vous n'utilisez cette fonction que dans ce type. Dans de nombreux cas, la même comparaison est utilisée dans de nombreux endroits.
soie
1
C'était parfait pour ce que j'avais à faire. Merci!
Christopher Smit
3

Dans la classe de modèle Laravel (5.6), je l'ai appelé comme ça, les deux méthodes sont publiques statiques, utilisant php 7.2 sur Windows 64 bits.

public static function usortCalledFrom() 

public static function myFunction()

J'ai appelé usortCalledFrom () comme ça

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

Aucun de ceux-ci n'était du travail

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
hrnsky
la source
static::au lieu du nom de la classe, c'est ce dont j'avais besoin, merci de l'avoir mentionné.
Sincère