#php #arrays #laravel #sorting
#php #массивы #laravel #сортировка
Вопрос:
У меня есть большой файл, содержащий описи в этом формате:
$inventories = {"External Hard Drives":2,"Cables":1,"Disks":10,"Floppy Drives":1,"USB Sticks":5}`
Я пытаюсь отсортировать их по значению каждого в порядке возрастания. Я пытался:
arsort($inventories)
и array_sort(inventories)
безуспешно. Любая помощь, пожалуйста? Я работаю в Laravel 5.6.
Комментарии:
1.
$inventories = {"External Hard Drives":2,"Cables":1,"Disks":10,"Floppy Drives":1,"USB Sticks":5}
. PHP не поддерживает такой синтаксис.
Ответ №1:
Вы почти на месте. array_sort
поддерживает не объект, а массив.
$inventories = '{"External Hard Drives":2,"Cables":1,"Disks":10,"Floppy Drives":1,"USB Sticks":5}';
Теперь расшифруйте это с помощью 2-го параметра true
, чтобы преобразовать в ассоциативный массив.
$inventories = json_decode($inventories, true); // now you have array
Затем вы можете сделать это по-своему :
$inventories = array_sort($inventories); // this works
Или используйте подход Laravel Collections (https://laravel.com/docs/5.6/collections#method-sort), который автоматически преобразует для вас :
$inventories = collect($inventories);
$inventories = $inventories->sort();
echo json_encode($inventories);
выведет :
{
Cables: 1,
Floppy Drives: 1,
External Hard Drives: 2,
USB Sticks: 5,
Disks: 10
}
Сделайте необычное сравнение с двумя значениями :
$inventories = $inventories->sort(function($v1, $v2) {
return $v2 > $v1;
});
Это выведет обратное :
{
Disks: 10,
USB Sticks: 5,
External Hard Drives: 2,
Cables: 1,
Floppy Drives: 1
}
Сортировка в Laravel используется uasort
в фоновом режиме, поэтому вы также можете использовать их напрямую, но только с массивом в качестве входных данных.
Ответ №2:
Как только вы прочитаете свой файл, вы могли бы сделать что-то вроде
$inventories = '{"External Hard Drives":2,"Cables":1,"Disks":10,"Floppy Drives":1,"USB Sticks":5}';
collect(json_decode($inventories))->sort();
Вывод
=> IlluminateSupportCollection {#2968
all: [
"Cables" => 1,
"Floppy Drives" => 1,
"External Hard Drives" => 2,
"USB Sticks" => 5,
"Disks" => 10,
],
}