やりたいこと
以下の様なall形式の配列があり,
$usersAll = [ [ 'User' => [ 'id' => 101, 'family_name' => '田中', 'first_name' => '一郎', ], ], [ 'User' => [ 'id' => 102, 'family_name' => '佐藤', 'first_name' => '二郎', ], ], ];
この family_name と first_name を半角スペースで結合した以下の様なlist形式の配列取得したい。
$usersList = [ 101 => '田中 一郎', 102 => '佐藤 二郎', ];
どうしたものか。
考察
キーをある値にして配列を作成することができるのは Hash::combine のみ。
よって,
$expected1 = [ [ 'id' => 101, 'full_name' => '田中 一郎', ], [ 'id' => 102, 'full_name' => '佐藤 二郎', ], ];
この様な配列を作れたとすると
$usersList = Hash::combine($expected1, '{n}.id', '{n}.full_name');
とできるので,$usersAll から $expected1 をどう作ればよいかを考えればよい。
Hash::insert や hash::format を使えばいいような気がするがうまくいかない。。。
結論
Hash::map を使って full_name キーを代入した配列を作ればよい。
$usersAll = [ [ 'User' => [ 'id' => 101, 'family_name' => '田中', 'first_name' => '一郎', ], ], [ 'User' => [ 'id' => 102, 'family_name' => '佐藤', 'first_name' => '二郎', ], ], ]; $expected2 = Hash::map($usersAll, '{n}', function($record) { $record['full_name'] = sprintf( "%s %s", $record['family_name'], $record['first_name'] ); return $record; }); /* $expected2 の結果 [ [ 'id' => 101, 'family_name' => '田中', 'first_name' => '一郎', 'full_name' => '田中 一郎', ], [ 'id' => 102, 'family_name' => '佐藤', 'first_name' => '二郎', 'full_name' => '佐藤 二郎', ], ]; */ $usersList = Hash::combine($expected2, '{n}.id', '{n}.full_name'); /* $usersList の結果 [ 101 => '田中 一郎', 102 => '佐藤 二郎', ]; */