3

I have tried sorting the below array to keep the even values on top and in sorted order from asc to desc

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

I tried this to sort the array

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

I got the output like below

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

And I want the output array to be

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

The even and odd values should be sorted in asc to desc order but keep the even values on top of odd values

4

6 に答える 6

6

usort安定していません。ドキュメントには次のように記載されています。

2 つのメンバーが等しいと比較された場合、並べ替えられた配列内の相対的な順序は未定義です。

だから、あなたができることは次のとおりです。

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

これは、両方が偶数または両方が奇数である場合に、実際の値を比較します。

于 2013-02-08T07:43:45.453 に答える
4

もう少し複雑な機能が必要だと思います。あなたがそれを見るとき、世話をするさまざまなケースがあり、それらのすべてで何か異なることが起こらなければならないからです:

  • $a$bどちらも偶数: デフォルトの数値比較
  • $a$bどちらも奇数: デフォルトの数値比較
  • $a偶数、$b奇数:$a常により小さい$b
  • $a奇数、$b偶数:$b常により小さい$a

実装については、 fab の回答を参照してください。

于 2013-02-08T07:46:15.177 に答える
2

少し長いですが、私にとってはうまくいきます:

$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);
于 2013-02-08T07:44:00.017 に答える
2
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;
                    }
            }
        );
于 2013-02-08T07:44:36.237 に答える
1

それを書くための短くて簡単な方法:

<?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);
?>
于 2013-02-08T08:00:41.093 に答える
0

比較関数では、まず 2 つの数値の mod 2 値の差をとります。

-1、0、または 1 になります。ゼロでない場合は、1 つの数値が偶数で、もう 1 つの数値が奇数であるため、その値を返すことができます。(これにより、オッズが偶数より上にソートされます。)

ゼロの場合、両方の数が偶数か両方の数が奇数であり、引き分けにするには 2 つの数の差を取る必要があります。

これを簡潔に書くと次​​のようになります。

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

代わりに最初に奇数をソートするには、最初の比較で$aとを入れ替えます。$b

return $b % 2 - $a % 2 ?: $a - $b;
于 2018-11-01T21:21:21.750 に答える