按键顺序增强分类

Enhancing asort by order of keys

我正在使用 asort 对数值数组进行排序。例如

$arr = [0,1,1,2,1,2,2,3];

在 运行 asort 之后我得到:

Array
(
    [0] => 0
    [4] => 1
    [2] => 1
    [1] => 1
    [6] => 2
    [3] => 2
    [5] => 2
    [7] => 3
)

但我希望按以下顺序获得它:

Array
(
    [0] => 0
    [1] => 1
    [2] => 1
    [4] => 1
    [3] => 2
    [5] => 2
    [6] => 2
    [7] => 3
)

查看上面按键顺序的不同。

sortarray。 然后通过翻转的方式生成一个array,使得key可以按照value分开。使用键对数组进行排序并将它们合并到一个数组中。并将键与排序后的值组合起来。

$arr = [0,1,1,2,1,2,2,3];

asort($arr);
$sorted = $arr;

$flipped = $new_keys = array();
foreach($arr as $key => $val) {
   $flipped[$val][] = $key; // Get the keys
}

foreach($flipped as $key => $val_array) {
    asort($val_array); // Sort the keys
    $new_keys = array_merge($new_keys, $val_array);
}

$final = array_combine($new_keys, $sorted); // Combine them again
var_dump($final);

输出

array(8) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(1)
  [4]=>
  int(1)
  [3]=>
  int(2)
  [5]=>
  int(2)
  [6]=>
  int(2)
  [7]=>
  int(3)
}

这应该适合你:

首先使用 array_walk() 遍历每个数组值,并将每个值更改为包含值和键的数组。

在此之后使用 uasort() 对数组进行排序,如果两个值相同,则使用键选择哪个应该排在第一位。

最后只需使用 array_column() 将数组转换回来。

<?php

    $arr = [0,1,1,2,1,2,2,3];
    array_walk($arr, function(&$v, $k){
        $v = ["value" => $v, "key" => $k];
    });

    uasort($arr, function($a, $b){
        if($a["value"] == $b["value"]) {
            if($a["key"] == $b["key"])
                return 0;
            return $a["key"] > $b["key"] ? 1 : -1;
        }
        return $a["value"] > $b["value"] ? 1 : -1;
    });
    $arr = array_column($arr, "value", "key");

    print_r($arr);

?>

输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 1
    [4] => 1
    [3] => 2
    [5] => 2
    [6] => 2
    [7] => 3
)