【问题标题】:Sorting array keeping even values on top PHP对数组进行排序,在 PHP 上保持偶数
【发布时间】:2013-02-08 07:36:16
【问题描述】:

我尝试对下面的数组进行排序,以将偶数值保持在顶部,并按从 ascdesc 的排序顺序

$array = array(1,2,3,4,5,6,7,8,9,10);

我试过这个对数组进行排序

usort($array, function($a, $b) { 
                    if ($a % 2 == 0 )
                    { 
                        return 1 ;
                    }
                    else 
                    { 
                        return -1;
                    }
            }
        );

我得到如下输出

Array
(
    [0] => 7
    [1] => 9
    [2] => 1
    [3] => 5
    [4] => 3
    [5] => 2
    [6] => 4
    [7] => 6
    [8] => 8
    [9] => 10
)

我希望输出数组是

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
    [5] => 1
    [6] => 3
    [7] => 5
    [8] => 7
    [9] => 9
)

偶数和奇数应该按从高到低的顺序排列,但要保持偶数在奇数之上

【问题讨论】:

  • 所以也许你意识到你的回调函数中的返回值被颠倒了;但您还需要二次检查以升序排列偶数和升序排列赔率
  • @MarkBaker:我不知道该怎么做。我不知道如何在回调中编码

标签: php arrays sorting


【解决方案1】:

usort 不是stable。文档指出:

如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的。

那么,你可以做的是:

usort($array, function($a, $b) {
                if ($a % 2 == $b % 2) {
                    return intval($a - $b);
                }
                elseif ($a % 2 == 0 )
                { 
                    return -1 ;
                }
                else 
                { 
                    return 1;
                }
        }
    );

如果两者都是偶数或都是奇数,则会比较实际值。

【讨论】:

    【解决方案2】:

    我认为您需要一个更复杂的函数。因为当您查看它时,需要处理不同的情况,并且在每种情况下都必须发生不同的事情:

    • $a$b 都是偶数:默认数值比较
    • $a$b 都是奇数:默认数值比较
    • $a 是偶数,$b 是奇数:$a 总是小于 $b
    • $a 是奇数,$b 是偶数:$b 总是小于 $a

    有关实施,请参阅answer of fab

    【讨论】:

    • 你想向我解释反对意见吗?我觉得给定的答案缺乏解释,这就是为什么我发布我的答案,尽管其他人更快......我只是省略了编写任何代码,因为已经有足够的答案包含它。
    • 我同意没有理由投反对票。就我个人而言,我更喜欢激发提出要求的人去思考,而不是给他现成的解决方案。
    【解决方案3】:

    有点长,但对我来说很好用:

    $array = array(1,2,3,4,5,6,7,8,9,10);
    
    $even =array();
    
    $odd = array();
    
    foreach ($array as $item) {
    
      if($item%2==0) {
    
        $even[] = $item;
      }
    
      else {
    
        $odd[] = $item;
    
      }
    
    }
    
    usort($even);
    
    usort($odd);
    
    $array_sort = array_merge($even,$odd);
    
    print_r($array_sort);
    

    【讨论】:

      【解决方案4】:
      usort($array, function($a, $b) { 
                          if ($a % 2 == $b % 2) {
                                 if ($a == $b) {
                                     return 0;
                                 }
                                 return ($a < $b) ? -1 : 1;
                          } elseif ($a % 2 == 0) { 
                              return -1 ;
                          } else { 
                              return 1;
                          }
                  }
              );
      

      【讨论】:

        【解决方案5】:

        简单的写法:

        <?php
        $array = array(1,2,3,4,5,6,7,8,9,10);
        usort($array, function($a, $b){
          if ($a % 2 == $b % 2) {
            return $a - $b;
          }
          return $a % 2 != 0;
        });
        print_r($array);
        ?>
        

        或使用三元:

        <?php
        $array = array(1,2,3,4,5,6,7,8,9,10);
        usort($array, function($a, $b){
          return ($a % 2 == $b % 2) ? ($a - $b) : ($a % 2 != 0);
        });
        print_r($array);
        ?>
        

        【讨论】:

          【解决方案6】:

          对于比较函数,首先取两个数的mod 2值的差。

          它将是 -1、0 或 1。如果不为零,则一个数字是偶数,另一个是奇数,因此您可以返回该值。 (这将使赔率高于偶数。)

          如果为零,则要么两个数字都是偶数,要么两个数字都是奇数,你需要取两个数字的差来打破平局。

          一个简洁的写法是:

          usort($array, function($a, $b) {
              return $a % 2 - $b % 2 ?: $a - $b;
          });
          

          如果要在开头对奇数进行排序,请在第一次比较中交换 $a$b

          return $b % 2 - $a % 2 ?: $a - $b;
          

          【讨论】:

            猜你喜欢
            • 2017-07-07
            • 1970-01-01
            • 1970-01-01
            • 2015-10-24
            • 2010-10-04
            • 2010-10-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多