7

我需要根据 value在 php 中对数组进行排序,数组使用一些数字作为键和值,例如:

$a = array(70 => 1 ,82 => 5  ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);

我喜欢这样排序

Array
(
    [82] => 5
    [13] => 5
    [21] => 4
    [61] => 3
    [34] => 2
    [53] => 2
    [70] => 1
    [55] => 1
)

我使用arsort并且它有效,但是有一个问题,因为这个函数将默认排序和排序数组更改为:

Array
(
    [13] => 5
    [82] => 5
    [21] => 4
    [61] => 3
    [53] => 2
    [34] => 2
    [55] => 1
    [70] => 1
)
4

7 回答 7

12

构造一个新数组,其元素是原始数组的键、值和位置:

$temp = array();
$i = 0;
foreach ($array as $key => $value) {
  $temp[] = array($i, $key, $value);
  $i++;
}

然后使用将原始位置考虑在内的用户定义顺序进行排序:

uasort($temp, function($a, $b) {
 return $a[2] == $b[2] ? ($a[0] - $b[0]) : ($a[2] < $b[2] ? 1 : -1);
});

最后,将其转换回原来的关联数组:

$array = array();
foreach ($temp as $val) {
  $array[$val[1]] = $val[2];
}
于 2012-10-01T18:06:07.413 回答
5

这是因为sort函数族不稳定。如果您需要排序稳定,那么您要么必须自己实现它,要么遍历排序结果并使用array_splice.

于 2012-10-01T15:44:47.323 回答
4

作为参考,我在 Github 上放置了一组内置 PHP 函数的稳定排序变体:https ://github.com/vanderlee/PHP-stable-sort-functions ,基于@Barmar 的解决方案和其他一些技巧。

于 2015-05-23T10:27:19.027 回答
3

简单的解决方案array_multisort

$assoc = [
    70 => 1,
    82 => 5,
    61 => 3,
    55 => 1,
    34 => 2,
    53 => 2,
    21 => 4,
    13 => 5,
];

$keys = array_keys($assoc);
array_multisort($assoc, SORT_DESC, range(1, count($assoc)), $keys);
$assoc = array_combine($keys, $assoc);

print_r($assoc);
于 2016-03-10T18:53:41.407 回答
2

这是一个很大的解决方法,但它确实有效:

$a = array(70 => 1 ,82 => 5  ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);
$b = max($a);
$c = min($a);
$d = 0;
$sorted_list = array();
while($b >= $c){
    foreach($a as $key => $value){
        if($value == $b){
            $sorted_list[$key] = $value;
        }
    }
    $b--;
}

vardump 输出:

array(8) { [82]=> string(1) "5" [13]=> string(1) "5" [21]=> string(1) "4" [61]=> string(1) "3" [34]=> string(1) "2" [53]=> string(1) "2" [70]=> string(1) "1" [55]=> string(1) "1" } 
于 2012-10-01T16:04:21.743 回答
0

您可以创建自己的排序函数来满足您自定义的排序条件,然后使用 usort() 使用您创建的函数对数组进行迭代以对数组进行排序。

于 2012-10-01T16:06:56.083 回答
0

PHP 使用快速排序作为基本排序算法。你有两个选择:

  1. 首先使用 usort 并定义一个比较函数,它尊重前一个顺序
  2. 编写自己的稳定排序机制

我在 github 上编写了一个包 porth/avalanchesort ( https://github.com/porthd/avalanchesort ),其中包含一个递归的 naturell-merge-sort。您可以使用自己的比较函数和自己的数据结构。该包包含关联数组和列表数组的示例。

于 2020-07-22T09:25:10.460 回答