按键顺序增强asort

时间:2015-08-06 10:42:09

标签: php arrays associative-array

我正在使用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
)

查看上述按键顺序的差异。

2 个答案:

答案 0 :(得分:3)

首先sort array。 然后通过翻转生成array,以便key可以根据value s分隔。使用键对数组进行排序并将它们合并到数组中。并将键与排序值组合在一起。

$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)
}

答案 1 :(得分:3)

这应该适合你:

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

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

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

sphinx-build-dir

输出:

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

?>