2010-10-28 9 views
2

J'aimerais pouvoir trier ce tableau en fonction de la taille du tableau d'éléments;Tri des tableaux multidimensionnels par taille d'élément

array( 
    [0] => array([0] => 'B', [1] => 'C'); 
    [1] => array([0] => 'B'); 
    [2] => array([0] => 'A', [1] => 'C'); 
    [3] => array([0] => 'A', [1] => 'B', [2] => 'C'); 
    [4] => array([0] => 'C');  
    [5] => array([0] => 'A'); 
    [6] => array([0] => 'A', [1] => 'B'); 
    ) 

array( 
    [0] => array([0] => 'A'); 
    [1] => array([0] => 'B'); 
    [2] => array([0] => 'C'); 
    [3] => array([0] => 'A', [1] => 'B'); 
    [4] => array([0] => 'A', [1] => 'C'); 
    [5] => array([0] => 'B', [1] => 'C'); 
    [6] => array([0] => 'A', [1] => 'B', [2] => 'C'); 
) 
+0

Vous cherchez élégant ou "assez bon"? – Jason

Répondre

1

Vous pouvez le faire en 2 étapes.

  • Dans l'étape 1, trier les tableaux individuels sur la valeur .
  • Dans l'étape 2, trier le tableau 2D, d'abord en fonction de la taille et si la taille ne sont pas de tri égal sur les valeurs.

code:

foreach($input as $key => $val) { 
     sort($input[$key]); 
} 
usort($input, "cmp"); 
print_r($input); 

function cmp($a,$b) { 
     if(count($a) != count($b)) { 
       return count($a) - count($b); 
     } 
     for($i=0;$i<count($a);$i++) { 
       if($a[$i] != $b[$i]) { 
         return strcmp($a[$i],$b[$i]); 
       } 
     } 
     return 0; 
} 

Code in Action

4

fermetures Utilisation (PHP 5.3):

usort($array, function($a, $b) { return count($a) - count($b); }); 

Sans l'aide de fermetures (PHP 5.2):

usort($array, create_function('$a, $b', 'return count($a) - count($b)')); 

Notez que $array seront triés en place. Ne le recherchez pas dans la valeur de retour de usort().

2

Je n'ai pas testé cela, mais j'espère que vous pouvez comprendre.

function yoursort($a,$b) { 
    if(!(is_array($a) && is_array($b)) return 0; // item of array is not an array 
    $cntA = sizeof($a); 
    $cntB = sizeof($b); 
    if($cntA!=$cntB) return $cntA-$cntB; // smaller array up 
    foreach($a as $key=>$val) { 
    $ordA = ord($a[$key]); 
    $ordB = ord($b[$key]); 
    if($ordA!=$ordB) return $ordA-$ordB; // sort sub array by alphabet 
    } 
    return 0; // items are equal 
} 
usort($yourarray,"yoursourt"); 

Ici vous pouvez trouver plus sur usort http://php.net/manual/en/function.usort.php