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 ()
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'));
- Ouvrez la page de manuel http://www.php.net/usort
- voir que le type de
$value_compare_func
estcallable
- Cliquez sur le mot-clé lié pour atteindre http://php.net/manual/en/language.types.callable.php
- voir que la syntaxe est
array($this, 'merchantSort')
, 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 ) );
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;
});
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")