Сортировка пар ключ-значение в Laravel

#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,
     ],
   }