やりたいこと
以下の様な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 => '佐藤 二郎',
];
*/

