PHP & # 8220; Avertissement: usort () [function.usort]: Fonction de comparaison non valide & # 8221; sur le tri
-
22-07-2019 - |
Question
J'ai les données suivantes sous forme de tableau associatif
array
'abc' =>
array
'label' => string 'abc' (length=3)
'weight' => float 3
'wsx' =>
array
'label' => string 'wsx' (length=3)
'weight' => float 1
'qay' =>
array
'label' => string 'qay' (length=3)
'weight' => float 1
'http://test.com' =>
array
'label' => string 'http://test.com' (length=15)
'weight' => float 0
'Nasi1' =>
array
'label' => string 'Nasi1' (length=5)
'weight' => float 0
'fax' =>
array
'label' => string 'fax' (length=3)
'weight' => float 4
Je souhaite trier le tableau à l'aide de & label; label " ou "poids"
La fonction de comparaison de l'étiquette est la suivante:
function compare_label($a, $b)
{
return strnatcmp($a['label'], $b['label']);
}
et que je viens d'appeler la fonction d'une autre fonction:
usort($label, 'compare_label');
var_dump($label);
mais alors je reçois le message d'erreur et le tableau n'est pas trié. Je ne sais pas ce que je fais mal. J'ai essayé de remplacer:
-
usort ($ label, 'compare_label');
avecusort ($ label, compare_label);
-
usort ($ label, 'compare_label');
avecusort ($ label, $ this- > compare_label);
sans succès. Quelqu'un peut-il me donner un indice?
La solution
si compare_label
est une fonction membre (c'est-à-dire une méthode de classe), vous devez la transmettre différemment.
usort( $label, array( $this, 'compare_label' ) );
En gros, au lieu d’envoyer simplement une chaîne du nom de la fonction, vous envoyez un tableau à deux éléments, où le premier élément est le contexte (objet sur lequel la méthode peut être trouvée), et le deuxième élément est la chaîne de le nom de la fonction.
REMARQUE: Si votre méthode est statique, vous transmettez le nom de la classe en tant que premier élément du tableau
.usort( $label, array( __CLASS__, 'compare_label' ) );
Autres conseils
La fonction de comparaison est-elle définie comme une fonction globale ou comme une méthode d'objet? Si c'est une méthode, vous devrez modifier légèrement votre façon de l'appeler:
usort($label, array($object, "compare_label"));
Vous pouvez également le déclarer en tant que méthode statique de la classe elle-même:
public static function compare_label ($a, $b) {
[...]
}
usort($label, array(Class_Name, "compare_label"));