2009-11-21 139 views
1

我有一个这样的阵列:难阵列排序顺序

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"), 
); 

src元素的值可以是任何东西。

但是,只有最大。一个元素包含short(这里是元素1),并且只有最大值。一个包含long的元素(这里是元素4)。他们可以在阵列中的任何地方。或根本不存在。

我现在需要做的是:

  • shortsrc元素必须首先如果存在
  • conaining long元素必须是最后一个(如果存在)
  • 中不之间的顺序物。

因此,例如是这样的:

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 
); 

我将如何做到这一点? usort在这里似乎不是一个好主意。

回答

2

假设你的数组是$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

编辑以用strpos()替换preg_match()。每个人都知道,因此爱'(?!regex)'。 – scribble 2009-11-21 06:50:26

+0

不错!完全是我所需要的! – Max 2009-11-21 07:35:26

2

usort()在这里实际上可以工作得很好;如果第一个参数有“short”和/或第二个参数有“long”,则返回-1,反之亦然,如果两者都不是这样,则返回0(或任何其他值)。

0

或者,你不需要任何排序,如果你只是跟踪哪些元素具有“短”与“长”在输入时,则如:

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