2011-05-18 96 views
3

有人可以幫我嗎?我想訂購由密鑰 '相對'按鍵排序

print_r ($items) will output: 



Array(

[36] => Array 
    (
     [id] => 36 
     [name] => mp4 
     [total_items] => 58 
     [rel] => 5.3015 
    ) 

[61] => Array 
    (
     [id] => 61 
     [name] => mp3 
     [total_items] => 61 
     [rel] => 21.7269 
    ) 

[63] => Array 
    (
     [id] => 63 
     [name] => avi 
     [total_items] => 43 
     [rel] => 2.254 
    ) 
) 

此多維數組項[] 和我需要:第一[61] sencond [36]→[63]

謝謝您!

回答

2

下面是我用:

function array_sort(&$array, $on, $order=SORT_ASC) 
{ 
    $new_array = array(); 
    $sortable_array = array(); 

    if (count($array) > 0) { 
     foreach ($array as $k => $v) { 
      if (is_array($v)) { 
       foreach ($v as $k2 => $v2) { 
        if ($k2 == $on) { 
         $sortable_array[$k] = $v2; 
        } 
       } 
      } else { 
       $sortable_array[$k] = $v; 
      } 
     } 

     switch ($order) { 
      case SORT_ASC: 
       asort($sortable_array); 
      break; 
      case SORT_DESC: 
       arsort($sortable_array); 
      break; 
     } 

     foreach ($sortable_array as $k => $v) { 
      $new_array[$k] = $array[$k]; 
     } 
    } 

    return $new_array; 
} 

,因此會使用這樣的:

array_sort($items, 'rel'); 
+0

這應該被添加到PHP的標準庫考慮到人們經常會問它在這裏。 – 2011-05-18 18:57:17

+0

@PMV因此'+ 1' :-) – Neal 2011-05-18 18:58:03

+0

@PMV他們問,因爲他們沒有閱讀文檔;)有一個功能,可以讓你做到這一點,而不需要太多的代碼。使用[閉包](http://pl.php.net/manual/en/functions.anonymous.php)更簡單。 – Tadeck 2011-05-18 19:03:54

1
$rel = array(); 
foreach ($items as $key => $value) 
{ 
    $rel[$key] = $value['rel']; 
} 
array_multisort($rel, SORT_ASC, $items); 
+0

基本上只是對各個數組進行排序,不是嗎? – Neal 2011-05-18 18:54:58

+2

否:「可以使用array_multisort()一次對多個數組進行排序,也可以使用一個或多個維度對多維數組進行排序。」參考:http://us.php.net/array_multisort – 2011-05-18 18:57:47

2

沒有爲一個功能,它被稱爲uasort

usort文檔查看第一和第二個例子,適應它,也許這樣的:

function cmp($a, $b) 
{ 
    if ($a['rel'] == $b['rel']) { 
     return 0; 
    } 
    return ($a['rel'] < $b['rel']) ? -1 : 1; 
} 

uasort($your_array, "cmp"); 

有沒有幫助?

編輯:

另外,如果你的PHP版本比5.3更高,可以使用closures

uasort($your_array, function($a, $b){ 
    if ($a['rel'] == $b['rel']) { 
     return 0; 
    } 
    return ($a['rel'] < $b['rel']) ? -1 : 1; 
}); 

EDIT2:

我犯了一個錯誤:usort()用於排序而沒有維護密鑰關聯(請參見more info),uasort()函數就是您需要。我修正了上面的例子。

+0

這是一個多維數組。 '$ a ['rel']'如何存在? – Neal 2011-05-18 18:56:29

+2

'$ a'和'$ b'只是排序數組的元素。因爲這些元素本身就是數組,所以它們也有鍵(除非它們是空的) - 在這個例子中,數組的每個元素都有'rel'鍵。這足夠清楚了嗎? – Tadeck 2011-05-18 18:59:51