cakePHPのHashクラスでall形式からlist形式の配列を作る2016年2月20日

TOP  >  ブログ  >  cakePHPのHashクラスでall形式からlist形式の配列を作る

やりたいこと

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

コメントを残す

メールアドレスが公開されることはありません。