PHPのLaravelフレームワークでシステム開発を行っているとseederなどで、複数のデータを"列名=>値"の連想配列を配列の形で用意したい場合があります。素直に連想配列のArrayを作ると、”列名"の部分に何回も同じ列名を書く必要があり、コードが冗長になりがちです。
このような場合はLaravelのcollect()が用意しているmap(), combine(), toArray()を利用することでシンプルにテストデータを用意することができます
$columns = collect(['id', 'name', 'email']);
$values = collect([
[1, 'alice', 'alice@example.com'],
[2, 'bob', 'bob@example.co.jp'],
]);
$rows = $values->map(fn($x) => $columns->combine($x))->toArray();
dump($rows);
このコードのdump()結果は以下のようになり、1行のコードで連想配列のArrayを用意することができました。
array:2 [
0 => array:3 [
"id" => 1
"name" => "alice"
"email" => "alice@example.com"
]
1 => array:3 [
"id" => 2
"name" => "bob"
"email" => "bob@example.co.jp"
]
]
サンプルコード中にあるfn()は、PHP7.4以降のみで使用可能なので、7.3以前では以下のように書く必要がありまs
$rows = $values->map(function ($x) use ($columns) {
return $columns->combine($x);
)->toArray();
生成したデータをseederの初期データとして使いたい場合は、$rowsを下記の形でinsertすればよいです
DB::connection()->table('users')->insert($rows);
こちらもおススメ