Question

J'ai regardé usort, mais je suis encore un peu confus ...

Voici ce que l'objet monObjet $ ressemble à:

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
        )

J'ai vu ceci:

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

Je suis en train de trier selon tid, mais je suppose que je ne suis pas vraiment sûr si je dois changer le poids à quelque chose? Ou il fonctionne comme est? Je l'ai essayé, mais rien ... en sortie

Était-ce utile?

La solution

cmp est callback fonction que usort utilise pour comparer des objets complexes (comme la vôtre) pour savoir comment les trier. modifier cmp pour votre utilisation (ou le renommer à tout ce que vous voulez)

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

Autres conseils

Je suis en train d'écrire une fonction de comparaison pour trois heures. Il est très facile, en fait, mais je pensais que je manque quelque chose et écrit encore et encore de l'algorithme de changement de zéro à bien des égards le tester avec mon tableau d'échantillons.

Enfin, je réalise que le problème est à la fonction uasort interne. Il ne termine pas la comparaison avec tous les éléments. Je ne me rappelle pas le nom de l'algorithme utilisé en ce moment, mais je me utilise une version améliorée (OW le mien) en C ++. L'algorithme utilise un arbre binaire comme méthode de comparaison en divisant le réseau en autant de paires, au besoin dans un appel récursif à la fonction de tri avec de nouveaux index (inférieur, supérieur) à chaque fois.

Lorsque la tranche restante est d'un élément, puis les indices supérieur et inférieur sont les mêmes et la fonction pense qu'il a terminé (traitées tous les objets), bien que le dernier élément n'a pas été évaluée. fonctions de tri à l'aide de cet algorithme échoue lorsque le bloc plus intérieur a un nombre impair. Il fonctionne très bien 2, 4, 8 .... éléments, mais le travail de dévers avec 3, 5, 7, etc ... La condition exacte de l'échec dépend des éléments ordre de tri. Les chiffres ne sont pas toujours significatives.

Je résolu il y a des années de problèmes. Je ne peux pas le résoudre par moi-même pour PHP maintenant parce que je n'ai pas un compilateur PHP et je n'ai pas le code source PHP soit. Mais si quelqu'un de contacts de l'équipe de développement PHP moi, je peux fournir la copie de travail de cet algorithme en C ++. Le même algorithme est le moyen le plus rapide d'accéder à des éléments triés.

Pour obtenir l'opérateur l'utilisation d'objets de propriété -> { 'name_property'}, par exemple $ 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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top