PHP “Atenção: usort () [function.usort]: função de comparação inválida” na triagem
-
22-07-2019 - |
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');
comusort($label, compare_label);
-
usort($label, 'compare_label');
comusort($label, $this->compare_label);
sem sucesso. Alguém pode me dar uma dica?
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"));