Вы можете начать думать об этой проблеме как о «декартовом произведении» массивов на входе, а затем применить функцию форматирования к декартовому произведению. Алгоритм декартового произведения хорошо известен, вы можете посмотреть здесь для справки: https://rosettacode.org/wiki/Cartesian_product_of_two_or_more_lists
Я предлагаю использовать общую функцию «декартово произведение», которую вы можете использовать в своем коде.
Вот предлагаемое решение:
<?php
$input = Array
(
0 => Array
(
0 => 30,
1 => 31
),
1 => Array
(
0 => 4,
1 => 5,
2 => 32
),
2 => Array
(
0 => 29
)
);
$expected = Array
(
0 => "30,4,29",
1 => "30,5,29",
2 => "30,32,29",
3 => "31,4,29",
4 => "31,5,29",
5 => "31,32,29"
);
//make an intermediate array with the cartesian product of the $input array
$intermediate = cartesian($input);
// and then apply the "implode" function to format the output as requested.
$output = array_map(function($v) {
return implode(",", $v);
}, $intermediate);
var_dump($output);
if( ($output === $expected)) {
echo "output is equal to expected" .PHP_EOL;
} else {
echo "not equals" .PHP_EOL;
}
function cartesian($input) {
$result = array(array());
foreach ($input as $key => $values) {
$append = array();
foreach($result as $product) {
foreach($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}
, который производит этот вывод:
array(6) {
[0]=>
string(7) "30,4,29"
[1]=>
string(7) "30,5,29"
[2]=>
string(8) "30,32,29"
[3]=>
string(7) "31,4,29"
[4]=>
string(7) "31,5,29"
[5]=>
string(8) "31,32,29"
}
output is equal to expected