按特定顺序排序数组

时间:2011-07-18 11:49:13

标签: php arrays sorting

我有以下数组

Array
(
[0] => Array
    (
        [label] => Germany
        [conversions] => 1
    )

[1] => Array
    (
        [label] => United States
        [conversions] => 8
    )

[2] => Array
    (
        [label] => France
        [conversions] => 1
    )

[3] => Array
    (
        [label] => China
        [conversions] => 1
    )

[4] => Array
    (
        [label] => Philippines
        [conversions] => 1
    )

[5] => Array
    (
        [label] => Turkey
        [conversions] => 1
    )

我想订购以下数组,首先是转化(desc),然后是标签(asc)

输出将具有以下顺序:

United States
China
France
Germany
Philippines
Turkey

6 个答案:

答案 0 :(得分:4)

如果使用> = PHP 5.3 ...

usort($arr, function($a, $b) {

   $diff = $b['conversions'] - $a['conversions'];

   if ( ! $diff) {
      return strcmp($a['label'], $b['label']);
   } 

   return $diff; 

});

使用它< PHP 5.3。

答案 1 :(得分:1)

您需要使用PHP的usort()功能。这允许您编写一个确定排序顺序的函数,这样您就可以按照自己喜欢的顺序对事物进行排序。

该函数将由usort()算法重复调用,并将为您提供两个参数,即在任何给定时刻要排序的数组的两个元素。如果这两个元素中的第一个更大,则函数应返回-1,如果第二个元素更大则返回+1,如果为了排序的目的将它们视为相同,则返回零。

有关详细信息和示例,请参阅PHP手册页:http://php.net/manual/en/function.usort.php

答案 2 :(得分:1)

我在下面的回答中首选array_multisort PHP Manual,因为您可以使用参数指定排序顺序。

除了灵活性之外,它应该比使用usort更快,因为它有一个问题,即它没有真正参数化排序顺序,所以不要重新发明轮子。

为了更加舒适,请将其包装到函数中以将键指定为字符串(Demo):

$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC);

如:

$array = array(
  0 => array(
    'label' => 'Germany',
    'conversions' => 1,
  ),
  1 => array(
    'label' => 'United States',
    'conversions' => 8,
  ),
  2 => array(
    'label' => 'France',
    'conversions' => 1,
  ),
  3 => array(
    'label' => 'China',
    'conversions' => 1,
  ),
  4 => array(
    'label' => 'Philippines',
    'conversions' => 1,
  ),
  5 => array(
    'label' => 'Turkey',
    'conversions' => 1,
  ),
);

$multisortByKey = function(array $a) {
    $args = func_get_args();
    $a = array_shift($args);
    $extract = function($k) use($a) {return array_map(function($v) use($k) { return $v[$k]; }, $a); };
    # NOTE: The following check/for-loop is not entirely correct 
    # as multiple sort parameters per entry are allowed. I leave this
    # for practice.
    $c = count($args);
    if(!$c%2) throw new InvalidArgumentException('Parameter count mismatch');
    for($i=0;$i<$c;$i+=2)
        $args[$i] = $extract($args[$i]);
    $args[] = &$a;
    call_user_func_array('array_multisort', $args);
    return $a;
};

$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC);

var_dump($sorted);

答案 3 :(得分:0)

请尝试以下操作:(未测试,来源:PHP Example #3

foreach ($data as $key => $row) {
    $label[$key]   = $row['label'];
    $conversion[$key] = $row['conversion'];
}

array_multisort($conversion, SORT_DESC, $label, SORT_ASC, $data);

答案 4 :(得分:0)

您可以使用usort提供自己的排序功能

usort($a, function($x, $y) {
  return $y["conversions"] < $x["conversions"] ? 1 :
    ($x["conversions"] < $y["conversions"] ? -1 :
      strcmp($x["label"], $y["label"]))
    );
});

答案 5 :(得分:0)

试试这个

$myArray="your array";

<?php

foreach($myArray as $c=>$key) {
    $sort_conv[$c] = $key['conversions'];
    $sort_lable[$c] = $key['label'];
   }

array_multisort($sort_conv, SORT_ASC, $sort_lable, SORT_STRING, $myArray);
print_r($myArray);
?>