二维数组的自定义行由多列组成,其中一行“粘在”最后一个位置

问题描述 投票:0回答:2

我有一个数组,比如

$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
php arrays sorting multidimensional-array sticky
2个回答
1
投票

这个问题已经有一个写得很好的答案

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");

0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.