2009-11-21 8 views
1

J'ai un tableau comme celui-ci:tableau Difficile ordre de tri

array(
    0 => array("src" => "foo-21.gif"), 
    1 => array("src" => "bar-short.gif"), 
    2 => array("src" => "baz-1.gif"), 
    3 => array("src" => "whatever.gif"), 
    4 => array("src" => "some-long.gif"), 
    5 => array("src" => "xyz.gif"), 
); 

La valeur de l'élément src peut être quelque chose.

Cependant, il n'y aura que max. un élément contenant short (ici c'est l'élément 1) et seulement max. un élément contenant long (ici c'est l'élément 4). Ils peuvent être n'importe où dans le tableau. Ou pas du tout.

Ce que je dois faire maintenant est:

  • L'élément avec src contenant short doit être d'abord si présent
  • L'élément conaining long doit être la dernière si elle est présente
  • L'ordre entre ne pas matière.

Ainsi, l'exemple ressemblerait à ceci:

array(
    0 => array("src" => "bar-short.gif"), // containing "short" = first 
    1 => array("src" => "foo-21.gif"), 
    2 => array("src" => "baz-1.gif"), 
    3 => array("src" => "whatever.gif"), 
    4 => array("src" => "xyz.gif"), 
    5 => array("src" => "some-long.gif"), // containing "long" = last 
); 

Comment puis-je faire cela? usort ne semble pas être une bonne idée ici.

Répondre

2

En supposant que votre tableau est $list:

function short_long_sort($a, $b) 
{ 
    $short_str = '-short'; 
    $long_str = '-long'; 
    if (strpos($a['src'], $short_str)) return -1; 
    if (strpos($b['src'], $short_str)) return 1; 
    if (strpos($a['src'], $long_str)) return 1; 
    if (strpos($b['src'], $long_str)) return -1; 
    return 0; 
} 

usort($list, 'short_long_sort'); 
print_r($list); 
+0

Modifier pour remplacer preg_match() avec strpos(). Tout le monde sait que SO aime '(?! Regex)'. – scribble

+0

Nice! J'ai fait exactement ce dont j'avais besoin! – Max

2

usort() pourrait effectivement fonctionner très bien ici; return -1 si le premier argument a "short" et/ou le second argument a "long", 1 si vice versa, et 0 (ou quoi que ce soit, vraiment) si ce n'est pas le cas.

0

Sinon, vous n'avez pas besoin de trier quoi que ce soit si vous suivez juste quels éléments ont « court » et « long » lorsque vous les entrées, puis par exemple:

process($arr->[$short]); 
for ($i=0; $i < @$arr; $i++) { 
    process($arr->[$i]) if (($i != $short) && ($i != $long)); 
} 
process($arr->[$long]);