Как преобразовать массив и поддерево в коллекцию в Laravel?

#php #laravel #laravel-collection

Вопрос:

Я хочу преобразовать все мои статические данные в сбор в Laravel.

Это мои данные:

 static $menu_list = [
    [
        'path' => 'admin/report/transaction',
        'active' => 'admin/report',
        'name' => 'Report',
        'icon' => 'file-text',
        'children' => [
            'path' => 'admin/report/transaction',
            'active' => 'admin/report/transaction',
            'name' => 'Transaction',
        ],
    ],
];
 

Эта функция преобразует мои данные в массив:

 public static function menuList()
{
    $menu_list = collect(self::$menu_list)->map(function ($voucher) {
        return (object) $voucher;
    });
}
 

но функция выше может преобразовывать только основную часть массива, она не может преобразовываться children => [...] в коллекцию.

Ответ №1:

Вам нужен рекурсивный вызов.

 public static function convertToCollection()
{
    $menu_list = self::menuList(self::$menu_list);
}

public static function menuList($list)
{
    return collect($list)->map(function ($voucher) {
        if(is_array($voucher)) {
          return self::menuList($voucher)
        }
        return $voucher;
    });
}
 

Ответ №2:

Вам нужно снова использовать collect() внутри map() :

 public static function menuList()
{
    $menu_list = collect(self::$menu_list)->map(function ($voucher) {
        return (object) array_merge($voucher, [
            'children' => collect($voucher['children'])
        ]);
    });
}
 

Комментарии:

1. он возвращает ошибку При попытке получить свойство «дети» не-объекта в строке «дети» = > собрать($ваучер->>дети)

2. О, извини, я все исправил.

Ответ №3:

Просто добавьте небольшой кодовый мир в свой подход.

   $menu_list = collect(self::$menu_list)->map(function ($voucher) {
             $voucher['children'] = (object) $voucher['children'];
            return (object) $voucher;
        });
 

Выход

    IlluminateSupportCollection {#574 ▼
  #items: array:1 [▼
    0 => {#573 ▼
       "path": "admin/report/transaction"
       "active": "admin/report"
       "name": "Report"
       "icon": "file-text"
       "children": {#567 ▼
         "path": "admin/report/transaction"
         "active": "admin/report/transaction"
         "name": "Transaction"
      }
    }
  ]
}
 

Комментарии:

1. Это именно то, что сделал владелец потока.

2. но он хочет children быть объектом. Разве это не происходит из моего кода @shaedrich ?

3. он говорит it can't convert children => [...] to collection. . Так что мой ответ работает так, как он хотел.

4. Нет, они хотят path , active , name и icon быть объектом, насколько я могу видеть. И даже если бы вы были правы, для этого не требовался бы ответ, но комментарий о том, что владелец потока все делает правильно.

5. его кодовая база dosent делает детей объектом