PHP & # 8220; Avertissement: usort () [function.usort]: Fonction de comparaison non valide & # 8221; sur le tri

StackOverflow https://stackoverflow.com/questions/1229324

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'); avec usort ($ label, compare_label);
  • usort ($ label, 'compare_label'); avec usort ($ label, $ this- > compare_label);

sans succès. Quelqu'un peut-il me donner un indice?

Était-ce utile?

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"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top