Я генерирую массив категорий и подкатегорий в моем Laravel API для использования в моем клиентском приложении.
Я делаю это с помощью коллекции filter
а также map
Способы организации данных, извлеченных из базы данных:
// get the data from the category table
$categoryData = $categories->all()->categories();
// filter the data by category names we know we want and create the multi-dimensional array of the fields we need
$categoryList = $categoryData->filter(function ($value) {
return $value['Category'] == "by Area of Interest" || $value['Category'] == "by Grade Level";
})
->map(function ($value) {
return ['category' => $value['Category'], 'subCategory' => $value['Subcategory']];
});
dd($categoryList);
Когда я просматриваю результат die и dump, я получаю свою коллекцию с массивом правильно отформатированных элементов:
И если я вывести его в виде массива с:
dd($categoryList->toArray());
Я вижу многомерный массив, который я ожидаю.
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь вывести его как json для использования в моем клиентском приложении.
дд ($ categoryList-> toJson ());
Если я выведу как json, я получу объект, который содержит индексы массива php как свойства и подмассивы php как объекты, назначенные этим свойствам.
То, что я хочу, это объект json, который содержит массив объектов. например
$categoryList = [['category' => 'test', 'subCategory' => 'test'], ['category' => 'test', 'subCategory' => 'test']];
dd(json_encode($categoryList));
Какие выводы:
Есть ли что-то, что я делаю неправильно с моими коллекционными звонками?
Комментарий Хогбина:
Призыв к $categories->all()->categories();
возвращает коллекцию данных категории, которыми я затем манипулирую, чтобы получить свой список.
$categoryData = $categories->all()->categories();
dd($categoryData);
выходы:
Проблема в том, что индексы — это идентификаторы категорий, которые вы получите из eloquent collection, когда попытаетесь создать из него массив.
Если вы хотите иметь чистый массив объектов, я предлагаю сделать это:
json_encode(array_values($categoryList->toArray()));
Приведенное выше объяснение и вызовы функций дали мне конечный результат, который мне был нужен. После подтверждения, что это работает через эти вызовы функций, я посмотрел на Collection
методы класса, чтобы увидеть, как я могу реализовать это с помощью класса. Вот что я сделал:
$categoryList = $categoryData->filter(function ($value) {
return $value['Category'] == "by Area of Interest" || $value['Category'] == "by Grade Level";
})
->map(function ($value) {
return ['category' => $value['Category'], 'subCategory' => $value['Subcategory']];
})
->values()
;
Если вы посмотрите на Collection
учебный класс’ values()
метод, он делает то же самое:
Так как коллекция Laravel items
хранятся в виде массива, toArray()
вызов метода не нужен.
Других решений пока нет …