2010-09-28 4 views
0

Pour les deux derniers jours, j'ai essayé d'obtenir ma tête autour des axes suivants:Tri personnalisé avec usort en PHP - tri numérique avec 0 à la fin de la liste

J'ai un tableau 2 dimensions et i essayer pour le trier avec un algorithme personnalisé en utilisant usort().

Mon problème est, que j'essaye de trier des nombres comme dans l'ordre de 1 2 3 0 ainsi le zéro devrait toujours être le dernier article.

function customsort($e1, $e2) { 
    if ($e1["number"] == $e2["number"]) { 
     return $e1["year"] - $e2["year"]; 
    } elseif ($e1["number"] == 0) { 
     return 1; 
    } else { 
     return $e1["number"] - $e2["number"]; 
    } 
} 

Je pensais que ce serait faire l'affaire, mais seulement une partie des entrys avec un zéro obtenu triée à la fin de la liste. Je suis assez shure, que la liste n'est pas corrompue et le dumping de l'ensemble du tableau me montre, que chaque entrée utilisée fournit un zéro où il devrait être, mais ils ne sont pas triés de la bonne façon.

Merci à l'avance, Johnny

+0

À quoi ressemble votre tableau? –

+0

Mon tableau ressemble à: – Johnnycube

+0

array (array ("number" -> 0, "year" -> 2010), array ("number" -> 2, "year" -> 2010)) – Johnnycube

Répondre

2

Vous avez oublié d'appliquer le même raisonnement à e2:

function customsort($e1, $e2) { 
    if ($e1["number"] == $e2["number"]) { 
     return $e1["year"] - $e2["year"]; 
    } elseif ($e1["number"] == 0) { 
     return 1; 
    } elseif ($e2["number"] == 0) { 
     return -1; 
    } else { 
     return $e1["number"] - $e2["number"]; 
    } 
} 

Vous comparez la fonction doit cette propriété pour donner un sens

customsort($foo, $bar) == -1*customsort($bar, $foo) 

pour chaque $foo et $bar. En particulier (ce qui n'a pas fonctionné dans votre cas)

customsort({'number'=>3},{'number'=>0}); // should give a negative number, because 
customsort({'number'=>0},{'number'=>3}); // gives a positive number 
+0

Merci beaucoup – Johnnycube

+0

@ Johnnycube - De rien – Ishtar