Элегантный способ сортировать массив, как это - PullRequest
4 голосов
/ 12 августа 2010

Это мой массив:

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

Я хочу отсортировать это так:

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

Итак, сначала будут значения с нулевым значением, отсортированные от наименьшего значения к наибольшему значению, а затем отрицательные значения, отсортированные от наибольшего значения к наименьшему значению.

Есть какой-нибудь элегантный способ сделать это?

Ответы [ 5 ]

10 голосов
/ 12 августа 2010

Вот простая функция сравнения:

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

В сторону: С учетом вышесказанного, ноль падает на отрицательную сторону забора. Измените > на >=, если хотите, чтобы они поднимались к вершине положительной стороны указанного забора.

6 голосов
/ 12 августа 2010

Это не 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;'));
2 голосов
/ 12 августа 2010

Я уверен, что это можно сделать короче, но это работает:

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

?>

Рабочая ссылка.

2 голосов
/ 12 августа 2010

usort () может сортировать что угодно с вашим собственным набором правил
Не знаю, если это соответствует вашим эстетическим чувствам

0 голосов
/ 04 апреля 2017

Лучший алгоритм, с которым я столкнулся:

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

Это будет сортировать отрицательные числа от конца массива (как сплайс)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...