PHP & # 8220; Avviso: usort () [function.usort]: funzione di confronto non valida & # 8221; sullo smistamento

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

Domanda

Ho i seguenti dati come array associativo

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

Voglio ordinare l'array usando " label " o "peso"

La funzione di confronto per l'etichetta è:

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

e poi chiamo semplicemente la funzione da un'altra funzione:

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

ma poi ricevo il messaggio di errore e l'array non viene ordinato. Non so cosa sto facendo di sbagliato. Ho provato a sostituire:

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

senza successo. Qualcuno può darmi un suggerimento?

È stato utile?

Soluzione

se compare_label è una funzione membro (ovvero, metodo di classe), è necessario passarlo in modo diverso.

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

Fondamentalmente, invece di inviare semplicemente una stringa del nome della funzione, si invia un array a due elementi, in cui il primo elemento è il contesto (oggetto su cui è possibile trovare il metodo) e il secondo elemento è la stringa di il nome della funzione.

NOTA: Se il metodo è statico, si passa il nome della classe come primo elemento dell'array

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

Altri suggerimenti

La funzione di confronto è definita come una funzione globale o come metodo di un oggetto? Se è un metodo, dovrai cambiare il modo in cui lo chiami leggermente:

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

Puoi anche dichiararlo come metodo statico della classe stessa:

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

usort($label, array(Class_Name, "compare_label"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top