Преобразование массива массивов из коллекции Laravel в объект с массивом в json

Я генерирую массив категорий и подкатегорий в моем 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());

Я вижу многомерный массив, который я ожидаю.

результат dd при выводе в виде массива

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь вывести его как json для использования в моем клиентском приложении.

дд ($ categoryList-> toJson ());

Если я выведу как json, я получу объект, который содержит индексы массива php как свойства и подмассивы php как объекты, назначенные этим свойствам.

результат dd при выводе в json

То, что я хочу, это объект json, который содержит массив объектов. например

$categoryList = [['category' => 'test', 'subCategory' => 'test'], ['category' => 'test', 'subCategory' => 'test']];
dd(json_encode($categoryList));

Какие выводы:

пример того, что я хочу

Есть ли что-то, что я делаю неправильно с моими коллекционными звонками?

Комментарий Хогбина:

Призыв к $categories->all()->categories(); возвращает коллекцию данных категории, которыми я затем манипулирую, чтобы получить свой список.

$categoryData = $categories->all()->categories();
dd($categoryData);

выходы:

результат категорий -> все ()»></a></p>
<p><!--noindex--><!--/noindex--></p>
<div class=2

Решение

Проблема в том, что индексы — это идентификаторы категорий, которые вы получите из 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() метод, он делает то же самое:

метод значений в классе Collection

Так как коллекция Laravel items хранятся в виде массива, toArray() вызов метода не нужен.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]