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

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");

Maintenant, nous mettons à jour le code et supprimons toutes les fonctions globales et les mettons à leur place appropriée. 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 faire j'appelle une méthode d'objet dans la fonction usort ()

97
demandé sur Ibu 2011-05-19 09:03:34

5 réponses

Rendre 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'));
192
répondu Demian Brecht 2011-05-19 05:08:34
  1. Ouvrez la page de manuel http://www.php.net/usort
  2. voir que le type de $value_compare_func est 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')
64
répondu deceze 2013-10-28 09:23:13

, 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 ) );
10
répondu Justin 2016-05-03 14:21:22

Dans cet exemple, je trie par un champ dans le 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;
        });
3
répondu James K 2012-06-29 09:59:54

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

public static function usortCalledFrom() 

public static function myFunction()

J'ai appelé usortCalledFrom () comme ceci

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

Aucun d'entre eux n'était du travail

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
1
répondu hrnsky 2018-05-04 11:27:55