У меня есть массив 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»; Любая помощь будет оценена по достоинству.
Возможный дубликат php sort ($ array) возвращает 1 вместо отсортированного массива
из документации Returns TRUE on success or FALSE on failure, и если вы видите, что он принимает массив как ссылку bool usort ( array &$array , callable $value_compare_func ), это означает, что данный массив уже отсортирован.
Возможный дубликат Сортировка многомерного массива по значению
@AbdullahMalik Он связал вопрос многомерной сортировки в своем вопросе и использует данный ответ в своем коде. Описанная им проблема не имеет ничего общего с многомерной сортировкой.
Возможный дубликат сортировка массива на основе ключа-значения внутреннего массива






Все методы сортировки принимают массив для сортировки как ссылку. Таким образом, вам не нужно заботиться о возвращаемом значении, поскольку сортировка выполняется на месте.
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"?
Спасибо @Phillipp, но я получаю 0, пустой, пустой, 1,2 такого отсортированного массива.
@MujahedAKAS какой код вы пробовали? ваш или мой код с обработкой предложения_order?
это неверно, вы не можете вычесть предлагаемые заказы, так как один может быть 10, а другой 1, вам нужно заказать по offer_order, проверьте мой ответ, он вообще не сортирует массив
@stetoc of couse, что вы можете - результат не обязательно должен быть точно -1, 0 или 1 - он просто должен быть положительным, отрицательным или нулем, что имеет место, если вы просто вычитаете значения
подумав какое-то время, это может сработать, я неправильно подумал, например, что для сортировки должно быть> 0 или <0 или 0, но у меня в голове было несколько случаев, когда он не упорядочивал элементы должным образом, может быть, это просто моя ошибка
Если OP получает результаты, по его словам, возможно, поменяйте местами -1 и 1 из фиктивных возвращаемых значений. Это может подтолкнуть пустые до конца.
для сравнения элементов, у которых есть свойство «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, это никоим образом не отвечает на вопрос.
работает на php 7, в предыдущих версиях нужно использовать array_key_exists('suggest_order', $array) ? $array['suggest_order'] : -1;
Вы можете либо использовать null coalesce (??), либо проверить, установлена ли на каждой стороне ['Suggest_order'], и решить, как это повлияет на тест (то есть какое фиктивное значение вы хотите, чтобы оно переместилось в нужное место)