Как отсортировать массив php по значению, которое не будет присутствовать во всех элементах?

У меня есть массив php следующим образом:

$array =Array(
[310] => Array
    (
        [vendorname] => Utsav the vendor
    )
[309] => Array
    (
        [vendorname] => Ashish vendor
        [suggest_order] => 1
    )
[308] => Array
    (
        [vendorname] => praveen rathod vendor
    )
[262] => Array
    (
        [vendorname] => Yash Vendor
        [suggest_order] => 0
    )
[264] => Array
    (
        [vendorname] => amol vendro
        [suggest_order] => 2
    ));

И я хочу отсортировать его на основе ключа offer_order, поэтому самое низкое значение ключа offer_order должно быть первым, а затем более высокое значение, а в последнюю очередь идут все оставшиеся элементы, у которых даже нет ключа offer_order, например;

$array =Array(
[262] => Array
    (
        [vendorname] => Yash Vendor
        [suggest_order] => 0
    )
[309] => Array
    (
        [vendorname] => Ashish vendor
        [suggest_order] => 1
    )
[264] => Array
    (
        [vendorname] => amol vendro
        [suggest_order] => 2
    )
[310] => Array
    (
        [vendorname] => Utsav the vendor
    )

[308] => Array
    (
        [vendorname] => praveen rathod vendor
    ));

Я пробовал Массив сортировки PHP по значению подмассива.

function cmp_by_optionNumber($a, $b) {
  return $a["suggest_order"] - $b["suggest_order"];
}
print_r(usort($array, "cmp_by_optionNumber"));

И я также пробовал второй вариант в приведенном выше ответе,

$new_array=usort($array, function ($a, $b) {
    return $a['suggest_order'] - $b['suggest_order'];
});
print_r($new_array);

Но я получаю в ответ «1»; Любая помощь будет оценена по достоинству.

Вы можете либо использовать null coalesce (??), либо проверить, установлена ​​ли на каждой стороне ['Suggest_order'], и решить, как это повлияет на тест (то есть какое фиктивное значение вы хотите, чтобы оно переместилось в нужное место)

Nigel Ren 18.04.2018 13:02

Возможный дубликат php sort ($ array) возвращает 1 вместо отсортированного массива

Philipp Maurer 18.04.2018 13:02

из документации Returns TRUE on success or FALSE on failure, и если вы видите, что он принимает массив как ссылку bool usort ( array &$array , callable $value_compare_func ), это означает, что данный массив уже отсортирован.

Edwin 18.04.2018 13:04

Возможный дубликат Сортировка многомерного массива по значению

Abdullah Malik 18.04.2018 13:07

@AbdullahMalik Он связал вопрос многомерной сортировки в своем вопросе и использует данный ответ в своем коде. Описанная им проблема не имеет ничего общего с многомерной сортировкой.

Philipp Maurer 18.04.2018 13:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
6
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Все методы сортировки принимают массив для сортировки как ссылку. Таким образом, вам не нужно заботиться о возвращаемом значении, поскольку сортировка выполняется на месте.

function cmp_by_optionNumber($a, $b) {
  return $a["suggest_order"] - $b["suggest_order"];
}
usort($array, "cmp_by_optionNumber");
print_r($array);

Если вам нужно сделать какую-то особую обработку для Suggest_order, вы можете использовать isset внутри функции сортировки.

usort($array, function($a, $b) {
    if (isset($a["suggest_order"]) && isset($b["suggest_order"])) {
        return $a["suggest_order"] - $b["suggest_order"];
    }
    if (isset($a["suggest_order"])) {
        return -1;
    }
    if (isset($b["suggest_order"])) {
        return 1;
    }
    return 0;
});

Как насчет проблемы, когда у элемента нет "suggest_order"?

KIKO Software 18.04.2018 13:02

Спасибо @Phillipp, но я получаю 0, пустой, пустой, 1,2 такого отсортированного массива.

Ahmed Syed 18.04.2018 13:05

@MujahedAKAS какой код вы пробовали? ваш или мой код с обработкой предложения_order?

Philipp 18.04.2018 13:06

это неверно, вы не можете вычесть предлагаемые заказы, так как один может быть 10, а другой 1, вам нужно заказать по offer_order, проверьте мой ответ, он вообще не сортирует массив

stetoc 18.04.2018 13:07

@stetoc of couse, что вы можете - результат не обязательно должен быть точно -1, 0 или 1 - он просто должен быть положительным, отрицательным или нулем, что имеет место, если вы просто вычитаете значения

Philipp 18.04.2018 13:09

подумав какое-то время, это может сработать, я неправильно подумал, например, что для сортировки должно быть> 0 или <0 или 0, но у меня в голове было несколько случаев, когда он не упорядочивал элементы должным образом, может быть, это просто моя ошибка

stetoc 18.04.2018 13:12

Если OP получает результаты, по его словам, возможно, поменяйте местами -1 и 1 из фиктивных возвращаемых значений. Это может подтолкнуть пустые до конца.

Nigel Ren 18.04.2018 13:13

для сравнения элементов, у которых есть свойство «offer_order», с элементами, у которых его нет, вы можете использовать такую ​​функцию, как:

function cmp_by_optionNumber($a, $b) {
   $lval = $a["suggest_order"]??-1;
   $rval = $b["suggest_order"]??-1;
    return $lval > $rval ? 1 : $rval > $lval ? -1 : 0;
}

это будет правильно упорядочивать элементы по вашему желанию - с помощью ключа offer_order

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

Хотя это улучшение кода OP, это никоим образом не отвечает на вопрос.

Philipp Maurer 18.04.2018 13:08

работает на php 7, в предыдущих версиях нужно использовать array_key_exists('suggest_order', $array) ? $array['suggest_order'] : -1;

stetoc 18.04.2018 13:33

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