Ищем комбинации массива недоопределенной длины

Я работаю над личным проектом, и я застрял в поиске комбинаций всех элементов массива, как показано ниже. Я могу найти все комбинации, когда у меня есть определенное количество массивов, но, к сожалению, у меня этого нет.

Вот документированный код:

$C = array(
"I" => array(
    0   =>  array("I_1_1"),
    1   =>  array("I_1_2")
),
"L" => array(
    0   =>  array("L_1_1"),
    1   =>  array("L
I_1_1       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

I_1_2       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2
1"), ), "K" => array( 0 => array("K_1_1"), 1 => array("K_1_2"), 2 => array("K
I_1_1       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

I_1_2       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2
1"), 3 => array("K
I_1_1       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

I_1_2       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2
2"), ), );

В настоящее время $C имеет 3 элемента, но это очень вариабельно, так как у вас может быть 2+. Кроме того, каждый массив внутри $C также имеет переменную длину и может достигать максимальной длины 144, но это очень редко.

В любом случае, моя цель - заставить php-скрипт вывести это:

I_1_1       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

I_1_2       L_1_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

            L_2_1       K_1_1
                        K_1_2
                        K_2_1
                        K_2_2

Я сделал это специально, чтобы не повторять первые 2 столбца в выводе, чтобы вы могли видеть «направление» комбинации, но в конечном итоге вывод будет массивом, содержащим все возможные комбинации, подобные таким:

$result = array(array("I_1_1","L_1_1","K_1_1"),array("I_1_1","L_1_1","K_1_2")....

и так далее..

Я не знаю, ясно ли я выразился или запутал вас еще больше, но если нужны какие-либо подробности, пожалуйста, дайте мне знать.

Заранее спасибо всем, кто мне поможет, я очень ценю все усилия, которые вы, ребята, приложили, чтобы помочь таким людям, как я.

*Изменить: * Было бы лучше для меня изменить структуру массива, чем использовать эту, чтобы было проще генерировать перестановки?


person Dany Khalife    schedule 27.10.2011    source источник
comment
Я хочу посмотреть, можно ли это сделать с n измерениями   -  person Nick Rolando    schedule 27.10.2011


Ответы (1)


Если массив может идти только на три глубины, вы можете сделать:

$combos = array(array());
foreach($C as $D) {
    $old_combos = $combos;
    $combos = array();
    foreach($D as $E) {
        foreach($old_combos as $combo) {
            $combos[] = array_merge($combo, $E);
        }
    }
}

Если это переменная глубина, вам понадобится потрясающая рекурсия.

person Jeff Day    schedule 27.10.2011
comment
спасибо, да, это работает, как вы сказали, но, к сожалению, я не знаю, насколько глубок этот массив, потому что он зависит от пользовательского ввода - person Dany Khalife; 27.10.2011
comment
Тогда вы смотрите на какую-то причудливую рекурсию или аналогичные причудливые циклы while. Я бы рекомендовал изменить способ получения пользовательского ввода. - person Jeff Day; 31.10.2011