Удалить пустой объект stdclass из массива в PHP - PullRequest
0 голосов
/ 25 января 2019

У меня есть следующие примеры данных в PHP:

[{"id": 2088996538},{},{"id": 2077495673}]

Как я могу получить

[{"id": 2088996538},{"id": 2077495673}]

Я пробовал несколько вещей, например

unset($activities[1]);

но потом я получаю

{"0":{"id":2088996538},"2":{"id":2077495673}}

Это выглядит как-то так просто, но не могу понять это.

Конечная цель - очистить некоторые выходные данные strava api, удаляя все, что я не использую.

Редактировать:

$activities = json_decode('[{"id": 2088996538},{},{"id": 2077495673}]');
unset($activities[1]);
$activities = array_values($activities);
echo json_encode($activities);

это на самом деле работает, как я мог пропустить это.Собираюсь попробовать это с большим набором данных.Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если вы декодируете в массивы, используя второй аргумент, тогда фильтрация будет проще:

$activities = json_decode('[{"id": 2088996538},{},{"id": 2077495673}]', true);
$activities = array_values(array_filter($activities));

Но вам все равно нужно переиндексировать, если вы хотите последовательные индексы.

0 голосов
/ 25 января 2019

Вы можете отфильтровать пустые объекты.

$data = array_values(array_filter($data, function($item) {
    return (bool) (array) $item;
}));

array_values необходим для предотвращения получения формы {"0":{"id":2088996538},"2":{"id":2077495673}}, поскольку он переиндексирует массив.

Промежуточное приведение к массиву в обратном вызове необходимо, потому что любой объект оценивается как истина, независимо от того, пустой он или нет, но пустой массив будет оцениваться как ложь. Если вы декодируете в массивы вместо объектов, устанавливая для второго параметра json_decode значение true, это приведение не требуется.


Не имеет прямого отношения к исходному вопросу, но я предлагаю другой способ сделать это, начиная с данных из API:

$activities = json_decode($json, true);

$set_keys = array_flip(["start_latlng", "id", "start_date","name"]);

foreach ($activities as $activity) {
    if (!is_null($activity['start_latlng'])) {
        $result[] = array_intersect_key($activity, $set_keys);
    }
}

echo json_encode($result);
...