Pregunta

Tengo los siguientes datos como una matriz asociativa

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

Quiero ordenar la matriz usando " label " o " peso "

La función de comparación para la etiqueta es:

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

y luego simplemente llamo a la función desde otra función:

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

pero luego recibo el mensaje de error y la matriz no está ordenada. No sé, qué estoy haciendo mal. He intentado reemplazar:

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

sin éxito. ¿Alguien puede darme una pista?

¿Fue útil?

Solución

si compare_label es una función miembro (es decir, método de clase), entonces debe pasarla de manera diferente.

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

Básicamente, en lugar de simplemente enviar una cadena del nombre de la función, envía una matriz de dos elementos, donde el primer elemento es el contexto (objeto en el que se puede encontrar el método), y el segundo elemento es la cadena de el nombre de la función.

NOTA: Si su método es estático, entonces pasa el nombre de la clase como el primer elemento de la matriz

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

Otros consejos

¿La función de comparación se define como una función global o como un método de un objeto? Si se trata de un método, tendrá que cambiar ligeramente la forma en que lo llama:

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

También puede declararlo como un método estático de la clase en sí:

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

usort($label, array(Class_Name, "compare_label"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top