从PHP中的数组中删除空的stdclass对象

时间:2019-01-24 21:06:02

标签: php arrays object stdclass

我在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 :(得分:6)

您可以过滤出空对象。

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

array_values对于阻止您获取{"0":{"id":2088996538},"2":{"id":2077495673}}格式是必要的,因为它会重新索引数组。

在回调函数中将中间对象强制转换为数组是必需的,因为任何对象是否为空均求值为true,但空数组的取值为false。如果您通过将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);

答案 1 :(得分:3)

如果使用第二个参数解码为数组,则过滤会更容易:

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

但是,如果要顺序索引,仍然需要重新索引。