2011-05-18 97 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