Pergunta

i seguintes dados como uma matriz associativa

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

Eu quero classificar a matriz usando o "rótulo" ou "peso"

A função de comparação para o rótulo é:

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

e que eu apenas chamar a função a partir de outra função:

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

mas depois eu recebo a mensagem de erro e a matriz não está classificada. Eu não sei, o que eu estou fazendo errado. Eu tentei substituir:

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

sem sucesso. Alguém pode me dar uma dica?

Foi útil?

Solução

Se compare_label é uma função membro (ou seja, método de classe), então você precisa passá-lo de forma diferente.

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

Basicamente, em vez de apenas o envio de uma seqüência de caracteres do nome da função, você enviar uma matriz de dois elementos, em que o primeiro elemento é o contexto (objeto no qual o método pode ser encontrado), eo segundo elemento é a string de o nome da função.

NOTA: Se o método é estático, então você passar o nome da classe como o primeiro elemento do array

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

Outras dicas

É a função de comparação definida como uma função global ou como um método de um objeto? Se é um método, você terá que mudar a forma como você chamá-lo um pouco:

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

Você também pode declará-lo como um método estático da própria classe:

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

usort($label, array(Class_Name, "compare_label"));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top