2009-11-21 218 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]);