У меня есть этот массив:
$array = array
(
array('1', '2', '3'),
array('!', '@'),
array('a', 'b', 'c', 'd'),
);
И я хочу знать всю символьную комбинацию массивов sub.. например:
1!a
1!b
1!c
1!d
1@a
1@b
1@c
1@d
2!a
2!b
2!c
2!d
2@a
2@b
...
В настоящее время у меня есть этот код:
for($i = 0; $i < count($array[0]); $i++)
{
for($j = 0; $j < count($array[1]); $j++)
{
for($k = 0; $k < count($array[2]); $k++)
{
echo $array[0][$i].$array[1][$j].$array[2][$k].'<br/>';
}
}
}
Это работает, но я думаю, что это ужасно, и когда я добавляю больше массивов, я должен добавить больше для. Я вполне уверен существует способ сделать это рекурсивно, но я не знаю, как начать/как делать это. Немного справки могло быть хорошим!
Благодарит Вас!
Вы можете создать рекурсивную функцию, как это:
function combination($array, $str = '') {
$current = array_shift($array);
if(count($array) > 0) {
foreach($current as $element) {
combination($array, $str.$element);
}
}
else{
foreach($current as $element) {
echo $str.$element . PHP_EOL;
}
}
}
Затем:
combination($array);
Если вы хотите иметь все комбинации в новом массиве, а затем вывести их, расширьте функцию так:
function combination($array, array &$results, $str = '') {
$current = array_shift($array);
if(count($array) > 0) {
foreach($current as $element) {
combination($array, $results, $str.$element);
}
}
else{
foreach($current as $element) {
$results[] = $str.$element;
}
}
}
$results = array();
combination($array, $results);