【问题标题】:Laravel Collection Filter breaking serialization formatLaravel Collection Filter 破坏序列化格式
【发布时间】:2021-10-29 05:31:56
【问题描述】:

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

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

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

$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"}}

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

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

【问题讨论】:

  • 我不知道为什么,但你能试试这个:$string = \json_encode($collection->values());
  • 是的,values() 调用对我有用。谢谢。虽然,我仍然很好奇为什么 toArray() 不起作用。
  • 我认为集合会自动添加索引,因为您有键名,并且数组中的所有元素不能使用相同的键

标签: laravel serialization laravel-collection


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2015-02-17
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2019-03-15
    相关资源
    最近更新 更多