【问题标题】:Remove empty stdclass object from array in PHP从 PHP 中的数组中删除空的 stdclass 对象
【发布时间】:2019-06-18 16:46:52
【问题描述】:

我在 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);

这确实有效,我怎么会错过它。将尝试使用更大的数据集。谢谢!

【问题讨论】:

  • “我已经尝试了几件事” - 向我们展示您的尝试,我们可以从那里帮助您。
  • 你说得对:我只是在编辑我的尝试:)
  • JS / JSON 没有非顺序数组,所以它们必须导出到一个对象。因此,使用 unset 时的“解决方案”是将键重置为顺序(从 0 开始),使用例如array_values.
  • 好吧,如果 OP 想要一个 JSON 数组,而不是一个对象,那么...
  • 我建议您查看下面的答案,因为与手动取消设置数组项相比,它们是可扩展的。

标签: php arrays object stdclass


【解决方案1】:

您可以过滤掉空对象。

$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);

【讨论】:

  • 哇太棒了,只有几行代码,就像一个魅力!谢谢!
【解决方案2】:

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

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

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

【讨论】:

  • 希望他不需要一些 {foo:false}{foo:0}{foo:''} 值,但是是的
猜你喜欢
  • 2016-02-04
  • 2020-08-14
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
相关资源
最近更新 更多