vasmor
@vasmor
Интересуюсь

Как разбить многомерный массив на несколько по ключам?

есть массив
spoiler
$arr = [
	0 => [
		'name' => 'Воронеж',
		'key' => 'city',
		'id' => 35
	],
	1 => [
		'name' => 'Ленинский район',
		'key' => 'region',
		'id' => 39
	],
	2 => [
		'name' => 'Центральный район',
		'key' => 'region',
		'id' => 44
	],
	3 => [
		'name' => 'Воронеж',
		'key' => 'city',
		'id' => 51
	],
	4 => [
		'name' => 'Воронеж',
		'key' => 'city',
		'id' => 79
	],
	5 => [
		'name' => 'Ленинский район',
		'key' => 'region',
		'id' => 112
	],
]

нужно разбить его на массивы по значениям ключа 'key' так, чтобы значения ключа 'name' были уникальными, а все повторяющиеся значения ключа 'id' складывались в значение ключа 'ids' через запятую
из вышеприведенного массива должны получиться следующие два массива:
spoiler
$region = [
	0 => [
		'name' => 'Ленинский район',
		'ids' => '39,112'
	],
	1 => [
		'name' => 'Центральный район',
		'ids' => '44'
	]
]

$city = [
	0 => [
		'name' => 'Воронеж',
		'ids' => '35,51,79'
	]
]

список значений ключей известен заранее - $keys = ['region', 'city'];
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F
$grouped = [];

foreach ($arr as [ 'id' => $id, 'name' => $name, 'key' => $key ]) {
  $grouped[$key][$name] ??= [ 'name' => $name, 'ids' => [] ];
  $grouped[$key][$name]['ids'][] = $id;
}

foreach ($keys as $k) {
  $$k = array_map(fn($n) => [
    'name' => $n['name'],
    'ids' => implode(', ', $n['ids'])
  ], array_values($grouped[$k] ?? []));
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы