134 votes

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

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

Voici ce que j'avais avant dans mon code linéaire

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

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

pour trier, je fais simplement

usort($array,"merchantSort");

Maintenant, nous mettons à jour le code et supprimons toutes les fonctions globales pour les mettre à leur place. Maintenant, tout le code est dans une classe et je n'arrive 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().

254voto

Demian Brecht Points 11083

Faites en sorte que votre fonction de tri soit statique :

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

Et utiliser un tableau pour le second paramètre :

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

2 votes

C'est génial ! J'aimerais également souligner que la fonction de tri n'a pas besoin d'être déclarée implicitement comme une méthode statique, car elle fonctionne toujours sans :)

0 votes

@Jimbo - c'est logique, donc la fonction privée peut utiliser les variables d'instanciation et de classe. Oui, c'est génial ! Voyez aussi la réponse de @deceze, où vous pouvez passer $this (neato).

5 votes

Si vous rendez la fonction statique (ce que vous devriez faire), vous pouvez simplement écrire usort($array, 'ClassName:merchantSort') n'est-ce pas ?

86voto

deceze Points 200115
  1. ouvrir la page du manuel http://www.php.net/usort
  2. voir que le type de $value_compare_func es callable
  3. cliquez sur le mot-clé lié pour atteindre http://php.net/manual/en/language.types.callable.php
  4. voir que la syntaxe est array($this, 'merchantSort')

36voto

Justin Points 2493

Vous devez passer $this Par 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 ) );

0 votes

La deuxième section est maintenant bien meilleure. Mais il manque toujours le ") " dans votre premier exemple.

5voto

Wonderboy Points 285

Dans cet exemple, je trie par un champ 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 la portée de la classe, comme ceci...

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

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

1 votes

Cela n'a de sens que si vous n'utilisez cette fonction que dans ce seul tri. Dans de nombreux cas, la même comparaison est utilisée à plusieurs endroits.

1 votes

C'était parfait pour ce que je devais faire. Merci !

4voto

hrnsky Points 31

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

public static function usortCalledFrom() 

public static function myFunction()

J'ai appelé dans usortCalledFrom() comme ceci

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

Aucun d'entre eux n'était un travail

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X