Сначала отсортируйте строки двумерного массива по столбцу значений с отрицательными значениями, затем отсортируйте по убыванию абсолютных значений

У меня есть такой массив:

[
    ['array-5', 0],
    ['array-4', 0],
    ['array-1',-1],
    ['array-3', 2],
    ['array-2', 3]
]

Я хочу отсортировать это в PHP, чтобы отрицательные числа располагались перед положительными числами, и если знак тот же, величина (более отрицательная или более положительная) имеет приоритет.

Для приведенного выше примера желаемый результат будет таким:

[
    ['array-1',-1],
    ['array-2', 3],
    ['array-3', 2],
    ['array-4', 0],
    ['array-5', 0]
]

Смотрите usort()

Alex Howansky 11.04.2023 16:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если у $data есть ваш вклад, вы можете вызвать usort следующим образом:

usort($data, function ($a, $b) {
    $res = ($b[1] < 0) - ($a[1] < 0);
    $diff = abs($b[1]) - abs($a[1]);
    return $res ? $res : ($diff > 0) - ($diff < 0);
});

После того, как это будет выполнено, $data будет иметь желаемый порядок.

не работает для чисел меньше 1 и больше 0, например 0,5

matin 11.04.2023 18:19

О, у вас есть дробные числа... см. обновление.

trincot 11.04.2023 18:28

Сначала отсортируйте по минусам, а затем по убыванию абсолютного значения.

Код: (Демо)

usort(
    $array,
    fn($a, $b) => [$b[1] < 0, abs($b[1])]
                  <=>
                  [$a[1] < 0, abs($a[1])]
);

Или отделите вызовы abs() в качестве второй/запасной оценки: (Demo)

usort(
    $array,
    fn($a, $b) => ($b[1] < 0 <=> $a[1] < 0)
                  ?: (abs($b[1]) <=> abs($a[1]))
);

Возможно, более эффективным, но менее кратким было бы изолировать абсолютные значения, вызывая abs() для каждого значения только один раз.

Код: (Демо)

$notNegs = [];
$absVals = [];
foreach ($array as [1 => $v]) {
    $abs = abs($v);
    $absVals[] = $abs;
    $notNegs[] = $v === $abs;
}
array_multisort($notNegs, $absVals, SORT_DESC, $array);

Другие вопросы по теме