我有以下数组
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
答案 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);
?>