Laravel Многомерный массив для значений объекта коллекции - PullRequest
0 голосов
/ 03 марта 2020

У меня есть массив, который я хочу рекурсивно превратить в коллекцию и использовать коллекцию в качестве значений объекта.

Я хотел бы использовать объект коллекции аналогично тому, как используется 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"
          ]
        ]
      ]
    }
  ]
}
...