2009-08-04 3 views
4

j'ai données suivantes comme un tableau associatifPHP « Attention: usort() [function.usort]: fonction de comparaison non valide » sur le tri

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 veux trier le tableau en utilisant « label » ou « poids "

la fonction de comparaison pour l'étiquette est:

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 ensuite j'obtiens 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?

Répondre

21

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 fait, au lieu de simplement envoyer 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é), et le 2ème élément est la chaîne du nom de la fonction.

REMARQUE: Si votre méthode est statique, puis vous passez le nom de classe comme le premier élément du tableau

usort($label, array(__CLASS__, 'compare_label')); 
+0

oui, est une fonction membre ....et il fonctionne! :) – cupakob

1

est-il la fonction de comparaison définie comme une fonction globale ou comme méthode d'un objet ? Si c'est une méthode, vous devez changer la façon dont vous l'appelez légèrement:

usort($label, array($object, "compare_label")); 

Vous pouvez également déclarer comme une méthode statique de la classe elle-même:

public static function compare_label ($a, $b) { 
    [...] 
} 

usort($label, array(Class_Name, "compare_label")); 
Questions connexes