Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排序数组将偶数值保留在顶部_Php_Arrays_Sorting - Fatal编程技术网

Php 排序数组将偶数值保留在顶部

Php 排序数组将偶数值保留在顶部,php,arrays,sorting,Php,Arrays,Sorting,我已尝试对下面的数组进行排序,以使偶数值保持在顶部,并按排序顺序从asc到desc $array = array(1,2,3,4,5,6,7,8,9,10); 我试着对数组进行排序 usort($array, function($a, $b) { if ($a % 2 == 0 ) { return 1 ; }

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

$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
)
偶数值和奇数值应按asc到desc顺序排序,但偶数值应保持在奇数值之上

usort
不是。文件规定:

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

因此,您可以做的是:

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

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

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

$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);
usort($array,function($a,$b){
如果($a%2==$b%2){
如果($a=$b){
返回0;
}
回报率($a<$b)?-1:1;
}elseif($a%2==0){
返回-1;
}否则{
返回1;
}
}
);

我认为您需要一个更复杂的函数。因为当你看它时,有不同的情况需要处理,每一种情况都会发生不同的事情:

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

有关实现,请参见。

简短而简单的编写方法:

<?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);
?>

对于比较函数,首先取两个数字的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;

因此,您可能意识到回调函数中的返回值已被反转;但是你还需要一个二次检查来对上升中的偶数和上升中的几率进行排序order@MarkBaker:这就是我不知道如何表演的。我不知道如何在回拨中编码你想向我解释下否决票吗?我觉得给出的答案缺乏解释,这就是为什么我发布了我的答案,尽管其他人更快…我只是没有写任何代码,因为已经有足够多的答案包含这一点。我同意没有理由投反对票。就我个人而言,我更喜欢鼓励别人去思考,而不是给他现成的解决方案。
return $b % 2 - $a % 2 ?: $a - $b;