按键自然地对多维数组进行排序

时间:2013-12-06 18:46:56

标签: php arrays sorting

我在php中有一个多维数组,我想基于键值自然地对数组进行排序。有问题的数组:

array(27) {
  ["user1"]=>
  array(1) {
        ["link"]=>
        string(24) "http://twitch.tv/example"
  }
  ["someotheruser"]=>
  array(1) {
        ["link"]=>
        string(24) "http://twitch.tv/example"
  }
  ["anotheruser"]=>
  array(1) {
        ["link"]=>
        string(24) "http://twitch.tv/example"
  }
  // etc...
}

到目前为止,我尝试了一些事情,但我没有运气。使用带有natsort的uksort不起作用,如果我不需要,我不想为自然排序顺序编写客户比较器。我也试图单独对键进行排序,但这似乎不起作用

private function knatsort(&$array) {
    $keys = array_keys($array);
    natsort($keys);
    $new_sort = array();
    foreach ($keys as $keys_2) {
        $new_sort[$keys_2] = $array[$keys_2];
    }
    $array = $new_sort;
    return true;
}

4 个答案:

答案 0 :(得分:13)

更简单的东西。提取数组键并对其进行排序,按原因对原始文件进行排序:

array_multisort(array_keys($array), SORT_NATURAL, $array);

不区分大小写:

array_multisort(array_keys($array), SORT_NATURAL| SORT_FLAG_CASE, $array);

答案 1 :(得分:4)

结帐strnatcmp(); 这是使用它的关键功能的自然排序:

function knatsort(&$arr){return uksort($arr,function($a, $b){return strnatcmp($a,$b);});}

使用uksort的速度和返回值进行到位。 像这样使用它:

knatsort($array);

:)

答案 2 :(得分:1)

建立@ AbraCadaver之前的答案,我设法使用按位或将自然排序与不区分大小写相结合的单行解决方案。

array_multisort(array_keys($this->streams), SORT_NATURAL | SORT_FLAG_CASE , $this->streams);

$this->streams是我的多维数组。这似乎是最好的。

答案 3 :(得分:0)

比使用array_multisort更简单:实际上,您可以向内置的ksort函数提供排序标志,以使其按键以自然顺序对数组进行排序:

$arr = array(
    "CFoo" => "xx1",
    "AFoo" => "xx2",
    "1Foo" => "xx3",
    "10AFoo" => "xx4"
);

ksort($arr, SORT_NATURAL);

收益:

Array
(
    [1Foo] => xx3
    [10AFoo] => xx4
    [AFoo] => xx2
    [CFoo] => xx1
)

如果要递归地将其应用于多维数组,可以为此编写一个简单的函数:

function natksort_multi(&$arr = array()) {
    ksort($arr, SORT_NATURAL);

    foreach (array_keys($arr) as $key) {
        if (is_array($arr[$key])) {
            natksort_multi($arr[$key]);
        }
    }
}