【问题标题】:Sort an integer array, negative integers in the front and positive integers in the back对整数数组进行排序,负整数在前,正整数在后
【发布时间】:2015-08-20 04:00:14
【问题描述】:

给了我一个这样的数组:

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

我需要将其排序为负整数在前,正整数在后,并且相对位置不应该改变。所以输出应该是:

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

我尝试使用usort,但我无法保留相对位置。

function cmp ($a, $b)
{
    return $a - $b;
}
usort($input, "cmp");
echo '<pre>', print_r($input), '</pre>';

Array
(
    [0] => -4
    [1] => -2
    [2] => -1
    [3] => 1
    [4] => 2
    [5] => 3
    [6] => 3
    [7] => 4
)

【问题讨论】:

  • 输出中的-4在哪里?

标签: php arrays sorting


【解决方案1】:

试试这个..

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


$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($negative,$positive);
print_r($sorted);

演示:https://eval.in/419320

输出:

Array
(
    [0] => -1
    [1] => -2
    [2] => -4
    [3] => 1
    [4] => 2
    [5] => 3
    [6] => 3
    [7] => 4
)

【讨论】:

  • 这几乎是正确的,除了 OP 不希望对值进行排序。离开排序并组合$positive$negative 数组,你就很成功了。像这样:eval.in/419328
  • 感谢您的想法,您的方法我尝试使用 array_map ,但它为我返回空数组。 eval.in/419331
  • @Stuart Wagner 是的,我接受你的想法,但负值可能会针对其他概率重新排序
  • 你需要为你的例子使用闭包check this using array_filterusing array_map@Srini
  • @srini 我已经使用array_maparray_filter 发布了两个答案
【解决方案2】:

这是一个排序问题,但不是排序

问题可以分解如下:

  1. 将给定的数组分成两个数组;一个负数,另一个正数。 (应该考虑你想要0 的位置。)每个数组中的项目顺序应该与它们在输入数组中出现的顺序相同。

    例如,通过pushing 值来执行此操作。

  2. 连接两个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多