Laravel 对象集合导致关联数组而不是对象?

问题描述

当我将一个常规对象包装到一个集合中时,结果是一个关联数组。

我想继续使用它作为一个对象。

$obj = (object) ['count'=>1,'Now'=>Carbon::Now()];
dump($obj); // $obj->count = 1,$obj->Now = Carbon {...}

$collection = collect($obj);
dump($collection); // unwanted: $collection['count'] = 1,$collection['Now'] = Carbon {...}

similar question 中,提供的解决方案是 json_encode/json_decode $collection
但这会修改​​对象并丢失信息(例如,将 Now Carbon 对象转换为字符串)。

$collection = json_decode(collect($obj)->toJson());
dump($collection); // unwanted: $collection->count = 1,$collection->Now = "2021-05-25T10:43:34.301505Z"

如何将对象包装到集合中而不将其转换为关联数组?

解决方法

也许这是因为一个集合被认为是一个包含多个条目的数组。从技术上讲,您只传递一个未包装的条目,其属性被视为集合的数组条目。所以我想说,你使用的集合是错误的。

来自the docs

Illuminate\Support\Collection 类为处理数组数据提供了流畅、方便的包装器。

强调这一点的另一种方式是,Collection 类实现了 ArrayAccess 接口。因此,会发生这种情况:通过 Collection 创建 collect() 时,传递的数据设置为 $this->items。所以 Collection 不是数组,它只是让您通过数组符号访问 $this->items 的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...