问题描述
我想继续使用它作为一个对象。
$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
的内容。