2010-10-25 2 views
1

Un tableau arrive avec certaines ou toutes les valeurs suivantes, dans n'importe quel ordre. Quelle est la meilleure façon de les commander dans l'ordre croissant de la taille? Donc, en commençant par petit et se terminant par XXL. Je peux usort mais je suis un peu perdu quant à la façon dont les éléments doivent être commandés dans ma fonction définie par l'utilisateurTableau de commande personnalisé PHP

Small 
XXL 
Medium 
Large 
XL 

EDIT: omis quelques informations ainsi créé une nouvelle question Custom ordering array with key/value pairs

EDIT2: code complet

print_r($sizes); 
$sorted_sizes = $this->sort_sizes(array_unique($sizes)); 
print_r($sorted_sizes); 

function sort_sizes($sizes) 
{ 
    return uasort($sizes, array($this, 'cmp')); 
} 

function cmp($a,$b) 
{ 
    $sizeArray = array('Small' => 0, 'Medium' => 1, 'Large' => 2, 'XL' => 3, 'XXL' => 4); 
    return $sizeArray[$a] - $sizeArray[$b]; 
} 

Ce sorties:

Array 
(
    [66-507cddcd16d9786abafccfa78b19acf8] => XL 
    [64-507cddcd16d9786abafccfa78b19acf8] => medium 
    [65-507cddcd16d9786abafccfa78b19acf8] => large 
    [63-507cddcd16d9786abafccfa78b19acf8] => small 
) 

et print_r ($ sort ed_sizes) donne juste sortie « 1 »

Répondre

6

réponse Mise à jour selon le code complet

Le premier problème ici est que vous retournez le résultat de uasort():

function sort_sizes($sizes) 
{ 
    return uasort($sizes, array($this, 'cmp')); 
} 

C'est faux, parce que uasort() ne renvoie pas le tableau trié. Il modifie la même variable que vous passez en paramètre et renvoie une valeur booléenne. C'est pourquoi vous voyez 1 en sortie.

Faire la méthode accepte $sizes par référence:

function sort_sizes(array &$sizes) 
{ 
    uasort($sizes, array($this, 'cmp')); 
} 

appellent alors comme si:

print_r($sizes); 
$sorted_sizes = array_unique($sizes); 
$this->sort_sizes($sorted_sizes); 
print_r($sorted_sizes); 

Voici votre méthode cmp(), avec un soutien supplémentaire pour le tri insensible à la casse:

function cmp($a, $b) 
{ 
    $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4); 
    return $sizes[strtolower($a)] - $sizes[strtolower($b)]; 
} 

Ancienne réponse

Essayez ceci. Utilisez uasort() à la place si vous voulez maintain key-value pairs:

function sort_sizes($a, $b) { 
    // Map the sizes to an ordered sequence of ints 
    static $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4); 

    // Find the difference, using the sizes as keys to the above array 
    return $sizes[strtolower($a)] - $sizes[strtolower($b)]; 
} 

$arr = array('Small', 'XXL', 'Medium', 'Large', 'XL'); 

print_r($arr); // Before sorting 
uasort($arr, 'sort_sizes'); 
print_r($arr); // After sorting 

Sortie:

Array 
(
    [0] => Small 
    [1] => XXL 
    [2] => Medium 
    [3] => Large 
    [4] => XL 
) 
Array 
(
    [0] => Small 
    [2] => Medium 
    [3] => Large 
    [4] => XL 
    [1] => XXL 
) 
+0

Dans le cas d'un tableau associé, vous pouvez utiliser 'uasort'. Un exemple: http://www.ideone.com/FjxgY – codaddict

+0

Comment appeler sort_sizes dans usort ($ arr, 'sort_sizes'); si ce sont des méthodes dans une classe? Habituellement j'appelle une fonction via $ this-> sort_sizes mais si je la passe comme un paramètre non-coté, j'obtiens une propriété Undefined: Products :: $ sort_sizes_do. – stef

+0

@stef: Au lieu de 'usort ($ arr, 'sort_sizes');', 'usort ($ arr, array ($ this, 'sort_sizes'));' – BoltClock

1

Faites le tri en deux phases. Tout d'abord, convertissez le texte en une valeur numérique pratique. En ce moment, vous devriez décider si "L" et "Large" correspondent à la même valeur ou non. Réorganisez ensuite le tableau en fonction de ces conversions numériques.

3

Vous pouvez le faire en utilisant array_multisort:

$orderIndex = array_flip(array('Small','Medium','Large','XL','XXL')); 
$arr = array('Small','XXL','Medium','Large','XL'); 
array_multisort(array_map(function($val) use ($orderIndex) { return $orderIndex[$val]; }, $arr), $arr); 

Ici array_map est utilisé avec un anonymous function pour construire un tableau du « poids » de chaque valeur dans $arr. Ce tableau est ensuite utilisé pour classer les valeurs dans $arr.

Ceci est fondamentalement le même as BoltClock suggested juste à faire la comparaison sur les "poids" déjà calculés.