web-dev-qa-db-fra.com

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

ok en utilisant usort avec une fonction 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 plaçons à leur emplacement approprié. 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 d'objet dans la fonction usort ()

111
Ibu

Rendez votre fonction de tri statique:

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

Et utilisez un tableau pour le second paramètre:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
216
Demian Brecht
  1. ouvrez la page de manuel http://www.php.net/usort
  2. voyez 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. voyez que la syntaxe est array($this, 'merchantSort')
70
deceze

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 ) );
14
Justin

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 l'étendue de la classe, comme ceci ...

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

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

Dans la classe de modèle Laravel (5.6), je l'ai appelée ainsi, les deux méthodes sont publiques statiques et utilisent 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 étaient travail

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