簡體   English   中英

按值降序對關聯數組進行排序,並在值相同時保留順序

[英]Sort an associative array by value in descending and preserve order when values are same

我想對一個關聯數組進行排序,並且有一個內置函數來實現相同的viz。 arsort() ,但此函數的問題是,當值相同時,它不會保持原始鍵順序。 例如

$l = [
    'a' => 1,
    'b' => 2,
    'c' => 2,
    'd' => 4,
    'e' => 5,
    'f' => 5
];

我想要的結果是:

$l = [
    'e' => 5,
    'f' => 5,
    'd' => 4,
    'b' => 2,
    'c' => 2,
    'a' => 1
];

arsort()以降序給出結果,但在值相同時隨機排列元素。 這個問題不是PHP數組多重排序的重復- 按值然后按鍵? 在那個問題中,它要求按字母順序對相同的數值進行排序,但在我的問題中,我要求值按照原始順序進行排序(如果它們相同)。

可能有一種更有效的方法可以做到這一點,但我認為這應該可以在相同值的組內維護原始鍵順序。 我將從這個數組開始,例如:

$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ]; 
  1. 按值對數組進行分組:

     foreach ($l as $k => $v) { $groups[$v][] = $k; } 

    因為foreach循環按順序讀取數組,所以鍵將以正確的順序插入到它們各自的組中,這將產生:

     [1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ]; 
  2. 按鍵按降序對組進行排序:

     krsort($groups); 
  3. 使用嵌套循環從分組數組重新組裝已排序的數組:

     foreach ($groups as $value => $group) { foreach ($group as $key) { $sorted[$key] = $value; } } 

您可以使用array_multisort 該函數可能有點令人困惑,並且很難解釋,但它會對多個數組進行排序,並且提供的第一個數組會根據后續數組的順序進行排序。

嘗試:

array_multisort($l, SORT_DESC, array_keys($l));

請參閱此處的示例: https//3v4l.org/oV8Od

它按降序值對數組進行排序,然后通過數組鍵上的排序進行更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM