Конвертировать объект объектов в массив объектов (PHP, Laravel) - PullRequest
4 голосов
/ 29 апреля 2019

Я возвращаю некоторые данные из БД с помощью Eloquent и помещаю их в объект массивов.Мой объект ответа браузеру отображается в следующем формате:

// response()->json($response, 200);


[{
"id": 1,
"name": "car",
"make": ["bmw", "ford"]
"order": 1
},
{
"id": 2,
"name": "bike",
"make": ["aprilia"]
"order": 2
},
{
"id": 3,
"name": "boat",
"make": []
"order": 3
 },
(...)
]

Прежде чем вернуть его, я хотел отфильтровать его на стороне сервера.Поэтому я возвращаю только те объекты, которые содержат значение в массиве "make".

Итак, я запускаю этот цикл:

        foreach ($response as $key => $transport) {

            if (count($response[$key]['make']) == 0) {
                unset($response[$key]);
            };

        }

Что делает php, это конвертирует массив в объект, а такжедобавляет ключи к каждому внутреннему объекту.Так что теперь мой $response выглядит так:


// response()->json($response, 200);


{ // notice here it has changed from array to object
  "0": { // notice here it has added key "0"
    "id": 1,
    "name": "car",
    "make": ["bmw", "ford"]
    "order": 1
  },
    "1" : { // notice here it has added key "1"
    "id": 2,
    "name": "bike",
    "make": ["aprilia"]
    "order": 2
  },
 (...)
}

Прежде всего - почему?И второй вопрос - как предотвратить / вернуться к ответу массива объектов?

1 Ответ

3 голосов
/ 29 апреля 2019

Когда вы отменяете значение из индексированного массива в PHP, существующие индексы остаются.Используя простой пример с небольшим диапазоном целых чисел для иллюстрации, следующий код удаляет все нечетные целые числа из массива:

$numbers = range(1, 5); // [1, 2, 3, 4, 5];

foreach ($numbers as $index => $number) {
    if ($number % 2 !== 0) {
        unset($numbers[$index]);
    }
}

print_r($numbers);

, что приводит к:

Array
(
    [1] => 2
    [3] => 4
)

Обратите внимание, что нечетные элементыудаляются, но индексы существующих элементов сохраняются .Из-за этих пробелов массив не индексируется последовательно в этой точке.

Следствием этого является то, что когда вы json_encode() этот массив, он предполагает, что эти непоследовательные индексы (давайте просто назовем их ключамина этом этапе) должны быть сохранены, поэтому вместо этого создается объектный литерал с ключами.Эти ключи являются строками, которые просто бывают целыми числами:

echo json_encode($numbers); // {"1":2,"3":4} 

Использование array_values($numbers) сбросит индексы вашего массива:

$reindexed = array_values($numbers);
echo json_encode($reindexed); // [2, 4]

Примечание: я упомянул в комментарии, что вы можете привестидля массива, используя (array) - это на самом деле не правильно, поскольку он будет сохранять непоследовательные индексы.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...