将两个集合映射为键和值

时间:2021-03-16 09:28:10

标签: php laravel collections

我有这样的集合 A...

[
    "Gender",
    "Name",
    "Role",
],

...而且我有一个来自这样的模型实例的 Collection B...

[
       App\Models\Staff {
         id: 11,
         name: "John Doe",
         gender: 'Male',
         2: "role",
         role: App\Models\Role {
           id: 1,
           name: "Director",
         },
       },

       App\Models\Staff {
         id: 22,
         name: "Jane Doe",
         gender: 'Female',
         2: "role",
         role: App\Models\Role {
           id: 2,
           name: "Company Secretary",
         },
       },
     ],

我怎样才能将两者结合起来,就像我拥有这样的 Collection C...

[
    [
         "Gender" => 'Male',
         "Name" => 'John Doe',
         "Role" => 'Director',
    ],
    [
         "Gender" => 'Female',
         "Name" => 'Jane Doe',
         "Role" => 'Company Secretary',
    ],
]

到目前为止,我已经尝试了一些方法,包括以此为起点。

return $collectionB->map(function ($b) use ($collectionA) {
    return $collectionA->map(function ($a) use ($b) {
        return [
            $a => $b['gender'],
            $a => $b['name'],
            $a => $b['role']['name'],
        ];
    })->all();
})->all();

1 个答案:

答案 0 :(得分:1)

您可以通过单个 map() 函数实现这一点

$data = [
    [
        'id' => 11,
        'name' => "John Doe",
        'gender' => "Male",
        "role" => [
            "id" => 1,
            "name" => 'Director',
        ]
    ],
    [
        'id' => 22,
        'name' => "John Doe",
        'gender' => "Male",
        "role" => [
            "id" => 2,
            "name" => 'Company Secretary',
        ]
    ]
];

$keys = [
    "Gender",
    "Name",
    "Role",
];

$data = collect($data)->map(function ($row) use ($keys) {
    return [
        $keys[0] => $row['gender'],
        $keys[1] => $row['name'],
        $keys[2] => $row['role']['name'] ?? '',
    ];
});


return $data;

输出是

[{
        "Gender": "Male",
        "Name": "John Doe",
        "Role": "Director"
    },
    {
        "Gender": "Male",
        "Name": "John Doe",
        "Role": "Company Secretary"
    }
]