2009-08-04 5 views
4

i wurden folgende Daten als assoziatives ArrayPHP "Warnung: usort() [function.usort]: Ungültige Vergleichsfunktion" auf Sortier

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 

I das Array unter Verwendung von "Label" oder „Gewicht sortiert werden soll "

die Vergleichsfunktion für das Label ist:

function compare_label($a, $b) 
{ 
    return strnatcmp($a['label'], $b['label']); 
} 

und als ich nenne nur die Funktion von einer anderen Funktion:

usort($label, 'compare_label'); 
var_dump($label); 

aber dann bekomme ich die Fehlermeldung und das Array ist nicht sortiert. Ich weiß nicht, was ich falsch mache. Ich habe zu ersetzen versucht:

  • usort($label, 'compare_label'); mit usort($label, compare_label);
  • usort($label, 'compare_label'); mit usort($label, $this->compare_label);

ohne Erfolg. Kann mir jemand einen Hinweis geben?

Antwort

21

Wenn compare_label eine Memberfunktion ist (also Klassenmethode), müssen Sie sie anders übergeben.

usort($label, array($this, 'compare_label')); 

Grundsätzlich anstatt nur eine Reihe von den Funktionsnamen zu senden, senden Sie eine Zwei-Element-Array, wobei das erste Element ist der Kontext (Objekt, auf das das Verfahren gefunden werden kann), und das 2. Element ist die Zeichenkette des Funktionsnamens.

HINWEIS: Wenn Ihre Methode statisch ist, dann übergeben Sie die Klassennamen als das erste Element des Arrays

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

ja, ist eine Elementfunktion ....und es funktioniert! :) – cupakob

1

Ist die Funktion als globale Funktion oder als Methode eines Objekts definiert vergleichen ? Wenn es ein Verfahren ist, werde müssen Sie ändern, wie Sie es nennen leicht:

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

Sie können erklären es auch als statische Methode der Klasse selbst:

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

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