【问题标题】:Elegant way to sort an array like this像这样对数组进行排序的优雅方式
【发布时间】:2010-08-12 11:11:11
【问题描述】:

这是我的数组:

$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);

我想这样排序:

1
2
3
4
-1
-2
-3
-4

所以首先会有大于零的值从最小值到最大值排序,然后会有负值从最大值到最小值排序。

有什么优雅的方法可以做到这一点吗?

【问题讨论】:

  • 我们是否应该假设零永远不会出现在这个数组中?

标签: php arrays sorting


【解决方案1】:

这是一个简单的比较函数:

function sorter($a, $b) {
    if ($a > 0 && $b > 0) {
        return $a - $b;
    } else {
        return $b - $a;
    }
}

$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
usort($arr, 'sorter');
var_dump($arr);

除此之外:在上面的情况下,零落在栅栏的负侧。如果您希望它们上升到所述栅栏正面的顶部,请将 > 更改为 >=

【讨论】:

    【解决方案2】:

    这是一个非usort() 方法,假设零无关紧要......

    <?php
    
    $arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
    
    $positive = array_filter($arr, function($x) { return $x > 0; });
    $negative = array_filter($arr, function($x) { return $x < 0; });
    
    sort($positive);
    rsort($negative);
    
    $sorted = array_merge($positive, $negative);
    print_r($sorted);
    
    ?>
    

    编辑:没有 PHP 5.3?如你所说,使用create_function()

    $positive = array_filter($arr, create_function('$x', 'return $x > 0;'));
    $negative = array_filter($arr, create_function('$x', 'return $x < 0;'));
    

    【讨论】:

    • 我会将最后一位更改为:$sorted = array_merge($positive,$negative);
    • 我有 PHP
    • @Richard Knop:我知道你并不懒惰,但为了他人的利益,我还是用 PHP
    • 我相信salathe的解决方案更好。 :)
    • @Savageman:我也是。我对他的回答表示赞成。
    【解决方案3】:

    usort() 可以使用您自己的规则集对任何内容进行排序
    不知道合不合你的审美

    【讨论】:

      【解决方案4】:

      我确信这可以缩短,但这很有效:

      <?php
      function cmp($a, $b) 
      {
              if ($a == $b) 
                      return 0;
              if($a>=0 && $b>=0 )
                      return ($a < $b) ? -1 : 1;
              if( $a<=0 && $b<=0)
                      return (-$a < -$b) ? -1 : 1;
              if($a>0)
                      return -1; 
              return 1;
      }
      
      $a = array(-3, -4, 1, -1, 2, 4, -2, 3);                                                                                                                                                                        
      
      var_dump($a);
      usort($a, "cmp");
      var_dump($a);
      
      ?>
      

      Working link.

      【讨论】:

        【解决方案5】:

        我进入的最佳算法是:

            if ((a >= 0) == (b >= 0)) {
                return a - b;
            } else {
                return b - a;
            }
        

        这将从数组末尾开始对负数进行排序(如拼接)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-07
          • 1970-01-01
          • 2013-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多