【问题标题】:Naturally sort a multi-dimensional array by key自然地按键排序多维数组
【发布时间】:2013-12-06 18:46:56
【问题描述】:

我在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...
}

到目前为止,我已经尝试了一些事情,但我没有运气。将uksort 与 natsort 一起使用是行不通的,如果我不需要的话,我不想为自然排序顺序编写自定义比较器。我还尝试单独对键进行排序,但这似乎不起作用

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;
}

【问题讨论】:

  • 定义“似乎不起作用”。顺便说一句,工作得很好for me
  • @raina77ow 我想我发现了我相当简单的错误,是我把natsort 误认为natcasesort,所以我想我可以换掉它。除此之外,我不知道为什么用array_multisort(array_keys($array), SORT_NATURAL, $array);回答的人删除了它,这是一个很好的答案!
  • @AbraCadaver 您只需要按位或不区分大小写。
  • 我实际测试过,确实很好用。 )

标签: php arrays sorting


【解决方案1】:

更简单的东西。提取数组键并对它们进行排序,按原排序:

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

不区分大小写:

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

【讨论】:

  • 不错的解决方案。谢谢……
  • 是的,这很漂亮。
【解决方案2】:

查看strnatcmp(); 这是使用它的自然排序功能:

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

与 uksort 的速度和返回值配合使用。 像这样使用它:

knatsort($array);

:)

【讨论】:

    【解决方案3】:

    甚至比使用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]);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      在@AbraCadaver 早先的回答的基础上,我设法使用按位或将自然排序与不区分大小写结合起来的单行解决方案。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2018-07-22
        相关资源
        最近更新 更多