Pergunta

Eu olhei para nós, mas ainda estou um pouco confuso ...

Aqui está como se parece o objeto $ myObject:

Array
(
    [0] => stdClass Object
        (
            [tid] => 13
            [vid] => 4
        )

    [1] => stdClass Object
        (
            [tid] => 10
            [vid] => 4
        )

    [2] => stdClass Object
        (
            [tid] => 34
            [vid] => 4
        )

    [3] => stdClass Object
        (
            [tid] => 9
            [vid] => 4
        )

Eu vi isso:

function cmp( $a, $b )
{ 
  if(  $a->weight ==  $b->weight ){ return 0 ; } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 
usort($myobject,'cmp');

Estou tentando classificar de acordo com o TID, mas acho que não tenho certeza se tenho que mudar peso para alguma coisa? Ou vai funcionar como está? Eu tentei, mas nada de ter produzido ...

Foi útil?

Solução

cmp é o a ligue de volta função que o USORT usa para comparar objetos complexos (como o seu) para descobrir como classificá -los. Modifique o CMP para seu uso (ou renomeie -o para o que quiser)

function cmp( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');

http://www.php.net/usort

Outras dicas

Eu tenho tentado escrever uma função de comparação há três horas. Na verdade, é muito fácil, mas pensei que estava faltando alguma coisa e escrevi de novo e de novo a partir do algoritmo de mudança de zero de várias maneiras testando -o com minha matriz de amostra.

Por fim, percebi que o problema está na função interna do UASORT. Não termina de comparar com todos os itens. Não me lembro do nome do algoritmo usado agora, mas eu mesmo uso uma versão aprimorada (OW Mine) em C ++. O algoritmo usa um método de comparação de árvore binária dividindo a matriz em tantos pares quanto exigidos em uma chamada recursiva para a função de classificação com novos índices (limites superiores inferiores) a cada vez.

Quando a fatia restante é de um item, os índices superiores e inferiores são iguais e a função pensa que terminou (manipulou todos os itens), embora o último item não tenha sido avaliado. As funções de classificação usando esse algoritmo falham quando o bloco mais interno tem um número ímpar. Funciona bem 2, 4, 8 .... elementos, mas não pode funcionar com 3, 5, 7 etc ... A condição exata da falha depende da ordem de classificação dos elementos. Os números nem sempre são significativos.

Eu resolvi esse problema anos atrás. Não posso resolver isso sozinho para PHP agora porque não tenho um compilador PHP e também não tenho código -fonte PHP. Mas se alguém da equipe de desenvolvimento do PHP entrar em contato comigo, posso fornecer a cópia de trabalho desse algoritmo em C ++. O mesmo algoritmo é a maneira mais rápida de acessar elementos classificados.

Para Get Property Stdclass Use Operator -> {'name_property'}, por exemplo, $ a -> {'tid'}

function cmp( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top