【问题标题】:Natural sorting of PHP array in reverse and not preserving keysPHP数组的自然排序反向而不保留键
【发布时间】:2012-03-23 16:03:15
【问题描述】:

我希望以相反的顺序自然地对数组进行排序,而不是保留键。例如,我想要这个数组:

[0] => 1-string
[1] => 2-string
[2] => 10-string
[3] => 4-srting
[4] => 3-srting

以这样的方式结束:

[0] => 10-srting
[1] => 4-string
[2] => 3-string
[3] => 2-string
[4] => 1-string

我已经用 usort($array, 'strnatcmp');但它不是相反的顺序。 array_reverse() after 没有帮助。

有什么想法吗?

【问题讨论】:

  • 这是自然排序还是非自然排序?我认为自然是“计数”,所以它是1-string, 10-string, 2-string, 3-string, 4-string,而不自然是4-string, 3-string, 2-string, 10-string, 1-string。众所周知,我会误解一些事情(因为我已婚,并且 24/7 都会发生错误沟通),所以您能否给出更深入的解释,因为我不了解您的订购系统。
  • Natural 是 1、2、3、4、10——我可以做到。我现在需要以相反的顺序得到它,所以:10、4、3、2、1。

标签: php arrays sorting


【解决方案1】:

我对“array_reverse() after 没有帮助”有点困惑。因为

<?php
echo PHP_VERSION, "\n";

$x = array( 
    '1-string',
    '2-string',
    '10-string',
    '4-srting',
    '3-srting'
);

natsort($x);
$x = array_reverse($x, false);
print_r($x);

打印

5.3.8
Array
(
    [0] => 10-string
    [1] => 4-srting
    [2] => 3-srting
    [3] => 2-string
    [4] => 1-string
)

在我的机器上

【讨论】:

    【解决方案2】:

    使用array_reverse()$preserveKeys 属性重置键以及在natcasesort() 之后反转数组。

    function rnatcasesort(&$array) {
        natcasesort($array);
        $array = array_reverse($array, false);
    }
    
    $values = array('1-string', '2-string', '10-string', '4-string', '3-string');
    
    rnatcasesort($values);
    
    var_dump($values);
    
    /*
    array(5) {
      [0]=>
      string(9) "10-string"
      [1]=>
      string(8) "4-string"
      [2]=>
      string(8) "3-string"
      [3]=>
      string(8) "2-string"
      [4]=>
      string(8) "1-string"
    }
    */
    

    【讨论】:

      【解决方案3】:

      rsort()SORT_NATURAL 标志一起使用。

      rsort($array, SORT_NATURAL);
      

      SORT_NATURAL 是在 PHP 5.4 中引入的。如果您使用的是较低版本,请使用 array_reverse(natsort()) 版本。

      【讨论】:

        【解决方案4】:

        你可以的

        <?php
        $arr  = array("1-string", "2-string", "10-string","4-srting", "3-srting");
        
        function sort_reverse($a, $b){
          $a = (int)$a;
          $b = (int)$b;
          if ($a > $b){
            return -1;
          }
          if ($a < $b){
            return 1;
          }
           return 0;
        }
        usort($arr, "sort_reverse");
        var_dump($arr);
        

        在这里垫http://codepad.org/6dn81S3f

        【讨论】:

          【解决方案5】:

          这行得通:

          $array = array('1-string', '2-string', '10-string', '4-string', '3-string');
          natsort($array);
          $array = array_reverse($array);
          print_r($array);
          

          【讨论】:

            【解决方案6】:

            使用该函数先进行自然排序,然后使用array_reverse进行降序排序

                function natrsort($array)
                {
                  natsort($array);
                  return array_reverse($array);
                }
                natrsort($array); 
            

            【讨论】:

              【解决方案7】:

              rsort($array) 不符合您的需要吗?

              【讨论】:

              • 不。这让我得到 4、3、2、10、1。
              猜你喜欢
              • 2013-03-20
              • 2012-08-09
              • 2023-04-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-21
              • 2013-03-23
              • 2013-03-16
              相关资源
              最近更新 更多