Laravel 集合过滤器破坏序列化格式

Laravel Collection Filter breaking serialization format

我有一个这样的序列化字符串

$string = '[{"name":"FOO"},{"name":""},{"name":"BAR"}]';

我正在尝试通过 Laravel 集合的过滤方法处理它并删除没有定义“名称”的项目 属性。

$collection = collect(\json_decode($string));
$collection = $collection->filter(function($v){
    return !empty($v->name);
});
$string = \json_encode($collection->toArray());
dd($string);

通常我期待这样的事情:

[{"name":"FOO"},{"name":"BAR"}]

但我得到这样的结果:

{"0":{"name":"FOO"},"2":{"name":"BAR"}}

有趣的是,如果我每次都跳过过滤过程或 return true,我会一直以所需的格式获取字符串。删除 toArray() 调用具有相同的结果。我不想将数字索引保留为关联对象键。

为什么会出现这种异常?我应该怎么做才能获得所需格式的序列化数据?

在PHP 数组中索引键必须是唯一的。 在您的情况下,您拥有键 'name' 并且集合会自动将索引键分配给集合中的所有项目。

要解决这个问题,只需调用

$string = \json_encode($collection->values());