从 PHP 中的数组中删除空的 stdclass 对象
Remove empty stdclass object from array in PHP
我在 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);
如果使用第二个参数解码为数组,则过滤更容易:
$activities = json_decode('[{"id": 2088996538},{},{"id": 2077495673}]', true);
$activities = array_values(array_filter($activities));
但是如果你想要顺序索引,你仍然需要重新索引。
我在 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);
如果使用第二个参数解码为数组,则过滤更容易:
$activities = json_decode('[{"id": 2088996538},{},{"id": 2077495673}]', true);
$activities = array_values(array_filter($activities));
但是如果你想要顺序索引,你仍然需要重新索引。