我有一个数组,比如
$xyz
包含:
[
7399 => [
'count' => 103,
'name' => '2º SEMESTRE - 2012',
],
7398 => [
'count' => 50,
'name' => '1º SEMESTRE - 2012',
],
7397 => [
'count' => 43,
'name' => '2º SEMESTRE - 2011',
],
7396 => [
'count' => 20,
'name' => '1º SEMESTRE - 2011',
],
7395 => [
'count' => 53,
'name' => '2º SEMESTRE - 2010',
],
'others' => [
'name' => 'Others',
'count' => 65,
],
]
我想按 count desc、name asc 对该数组进行排序,将“others”元素留在底部。 我已经使用了 array_multisort 如下
// Obtain a list of columns
foreach ($xyz as $key => $row) {
$count[$key] = $row['volume'];
$name[$key] = $row['edition'];
}
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($count, SORT_DESC, $name, SORT_ASC, $xyz);
但是失败了。它显示以下警告:
Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent
我想要的是这样的东西
array
7399 =>
array
'count' => int 103
'name' => string '2º SEMESTRE - 2012' (length=23)
7395 =>
array
'count' => int 53
'name' => string '2º SEMESTRE - 2010' (length=23)
7398 =>
array
'count' => int 50
'name' => string '1º SEMESTRE - 2012' (length=23)
7397 =>
array
'count' => int 43
'name' => string '2º SEMESTRE - 2011' (length=23)
7396 =>
array
'count' => int 20
'name' => string '1º SEMESTRE - 2011' (length=23)
'others' =>
array
'name' => string 'Others' (length=6)
'count' => int 65
这个问题已经有一个写得很好的答案:
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
}
因此,要按计数排序,您需要:
aasort($your_array,"count");
在
usort()
的回调中构建表达规则的数组,然后使用 spaceship 运算符来比较数据。操作者左侧的$a
和右侧的$b
表示ASC;反之亦然。
代码:(演示)
uasort(
$array,
fn($a, $b) =>
[
$a['name'] === 'Others',
$b['count'],
$a['name']
]
<=>
[
$b['name'] === 'Others',
$a['count'],
$b['name']
]
);
var_export($array);