2010-09-03 7 views
3

J'ai essayé d'adapter ce code pour trier un tableau multidimensionnel sur une clé/un champ nommé. Le champ est un entier dont j'ai besoin pour trier le plus petit au plus grand.PHP Tri d'un tableau multidimensionnel par nom de champ

function myCmp($a, $b) 
{ 
    return strcmp($a["days"], $b["days"]); 
} 

uasort($myArray, "myCmp"); 

Ceci trie les tableaux comme j'ai besoin mais dans le mauvais ordre. À l'heure actuelle, il trie le plus grand au plus petit, n'utilisant pas l'ordre naturel. J'ai besoin de trier le plus petit au plus grand dans l'ordre naturel (par exemple 2 vient avant 5, 12 et 24).

Répondre

1

Vous pouvez simplement inverser les paramètres de strcmp:

function myCmp($a, $b) 
{ 
    return strcmp($b["days"], $a["days"]); 
} 

uasort($myArray, "myCmp"); 
1

Puisque vous voulez trier dans l'ordre naturel, vous devriez pas utiliser strcmp, vous pouvez le faire:

function myCmp($a, $b) 
{ 
    if ($a['days'] == $b['days']) return 0; 
    return ($b['days'] > $a['days']) ? -1 : 1; 
} 

Voici un working example.

+0

Si quelqu'un est toujours regarder, cela ne revient pas à l'ordre naturel. Pour les nombres 27, 2, 5 il renvoie 5, 27, 2 – YsoL8

7

strnatcmp() est votre ami

par exemple (En utilisant un php 5.3 fermeture/anonymous function):

<?php 
$myArray = array('foo'=>array('days'=>2), 'bar'=>array('days'=>22), 'ham'=>array('days'=>5), 'egg'=>array('days'=>12)); 
uasort($myArray, function($a, $b) { return strnatcmp($a["days"], $b["days"]); }); 

foreach($myArray as $k=>$v) { 
    echo $k, '=>', $v['days'], "\n"; 
} 

impressions

foo=>2 
ham=>5 
egg=>12 
bar=>22 
Questions connexes