У меня есть массив, который я хочу рекурсивно превратить в коллекцию и использовать коллекцию в качестве значений объекта.
Я хотел бы использовать объект коллекции аналогично тому, как используется eloquent, вместо использования $contact['name']
и возможности использовать $collection->contacts->each
против foreach $collection->contacts .....)
$collection->contacts->each(function ($contact) {
// ability to use $contact->name (and not have to use $contact['name'])
});
Макрос коллекции :
Collection::macro('recursive', function () {
return $this->map(function ($value) {
if (is_array($value)) {
return (object)$value;
}
if (is_object($value)) {
return collect($value)->recursive();
}
return $value;
});
});
Пример:
public function test_it_can_recursively_convert_array_to_collection()
{
$data = [
[
'name' => 'Michael Scott',
'emails' => [
'mscott@dundermifflin.com',
'michaelscarn@dundermifflin.com',
],
'contacts' => [
[
'name' => 'Dwight Schrute',
'emails' => [
'dschrute@dundermifflin.com',
],
],
[
'name' => 'Jim Halpert',
'emails' => [
'jhalpert@dundermifflin.com',
],
],
],
],
];
$collection = collect($data)->recursive();
$this->assertInstanceOf(Collection::class, $collection);
$collection->each(function ($item) {
$this->assertEquals('Michael Scott', $item->name);
$item->contacts->each(function ($contact) {
$this->assertNotNull($contact->name);
});
});
}
Исходная карта коллекции работает (например, $collection->each .... $item->name
), но я не могу установить преобразование вложенных массивов в объекты и получить объект значения.
Error: Call to a member function each() on array
Illuminate\Support\Collection^ {#632
#items: array:1 [
0 => {#13
+"name": "Michael Scott"
+"emails": array:2 [
0 => "mscott@dundermifflin.com"
1 => "michaelscarn@dundermifflin.com"
]
+"contacts": array:2 [
0 => array:2 [
"name" => "Dwight Schrute"
"emails" => array:1 [
0 => "dschrute@dundermifflin.com"
]
]
1 => array:2 [
"name" => "Jim Halpert"
"emails" => array:1 [
0 => "jhalpert@dundermifflin.com"
]
]
]
}
]
}