@photosho

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

Подскажите решение, как скомбинировать массив такого вида:

$arr = [
	[
		'a' => [1],
		'b' => [2],
	],
	
	[
		'c' => [3],
		'd' => [4],
	],
	
	[
		'e' => [5],
		'f' => [6],
	],
];


В одномерный с объединением ключей (через "_") и значений (через "array_merge()) такого вида:

$arr2 = [
	'a_c_e' => [1, 3, 5],
	'a_d_e' => [1, 4, 5],
	'a_c_f' => [1, 3, 6],
	'a_d_f' => [1, 4, 6],
	'b_c_e' => [2, 3, 5],
	'b_d_e' => [2, 4, 5],
	'b_c_f' => [2, 3, 6],
	'b_d_f' => [2, 4, 6],
];


При добавлении вложенных массивов той же структуры или добавлении элементов в эти массивы алгоритм должен сохранять работоспособность. Получается, все элементы первого массива должны быть поочерёдно сгруппированы со всеми элементами следующих массивов, но только в одном направлении, сверху вниз.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
0xD34F
@0xD34F
function getCombinations($arr, $keys = [], $vals = []) {
  return ($n = $arr[count($keys)] ?? null)
    ? array_merge(...array_map(
        fn($k) => getCombinations(
          $arr,
          [ ...$keys, $k ],
          [ ...$vals, ...$n[$k] ]
        ),
        array_keys($n)
      ))
    : [ implode('_', $keys) => $vals ];
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы