【问题标题】:PHP: How to sort array by value first, then by key [duplicate]PHP:如何先按值排序数组,然后按键[重复]
【发布时间】:2014-01-20 16:26:01
【问题描述】:

我一直在为以下问题而烦恼。

我有这个数组:

[596] => 2
[9] => 2
[358] => 2
[1579] => 1
[156] => 1
[576] => 1
[535] => 1

如您所见,值是按降序排列的,但键是随机的。我也想对键进行 DESC 排序。我一直在玩array_multisort,但我无法解决它的问题。我遇到的第一个问题是 array_multisort 重新索引数字键。我将键更改为非数字变体,即 k596 等...这使我能够对键进行排序,但不像我想要的那样。

[k9] => 2
[k596] => 2
[k358] => 2
[k576] => 1
[k535] => 1
[k1579] => 1
[k156] => 1

最后我希望看到的结果是:

[k596] => 2
[k358] => 2
[k9] => 2
[k1579] => 1
[k576] => 1
[k535] => 1
[k156] => 1

有人可以帮我吗?一定有一种简单的方法可以做到这一点,对吧?

【问题讨论】:

标签: php arrays array-multisort


【解决方案1】:
uksort($array, function ($a, $b) use ($array) {
    if ($array[$a] != $array[$b]) {
        return $array[$a] - $array[$b];
    }
    return $a - $b;
});

插入适当的比较操作,这里以- 为例。如果您依赖于 PHP

【讨论】:

  • 奇怪,我尝试了类似的方法,但将$array 用作全局并最终得到警告“数组已修改”;然而,这似乎有效。
  • 而不是 return $a - $b; return $a > $b; 然后$array =array_reverse($array,TRUE);
  • @Nouphal 错了。您需要返回一个值 0,而不是布尔值。
【解决方案2】:

好吧,这个问题比我想象的要复杂一些!给定一个数组$arry = array('a'=>'hilbert', 'b'=>'noether', 'c'=>'landau');

我会生成第二个包含这样的元组的数组:

$brry = array();
foreach($arry as $key => $value){
    $brry[] = array($key,$value);
}

//Now $brry looks like:
//$brry:
//    [0] => array('a','hilbert');
//    [1] => array('b','noether');
//    [2] => array('c','landau');

//now you can easily sort it!
usort($brry, "cmp");

//And then transform it back to the array structure you have before
foreach($brry as $value){
    $crry[$value[0]] = $value[1];
}

//with this sorting function cmp:
function cmp($first, $second){
    if(strcmp($first[1], $second[1]) != 0){
        return strcmp($first[1], $second[1]);
    }
    else{
        return strcmp($first[0], $second[0]);
    }
}

函数 cmp 现在按字符串排序,所以 strcmp("192","20") > 0 虽然这可能不适用于整数!

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2023-04-06
    • 2016-11-03
    • 2013-11-19
    相关资源
    最近更新 更多