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());
我有一个这样的序列化字符串
$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());