我在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);
这实际上有效,我怎么能错过它.用更大的数据集来试试吧.谢谢!
解决方法:
您可以过滤掉空对象.
$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);