PHP Array Комбинации - PullRequest
       11

PHP Array Комбинации

0 голосов
/ 18 ноября 2009

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

Так что, если это массив:

$array = array(
    array('1', '2'),
    array('a', 'b', 'c'),
    array('x', 'y'),
);

Я также хочу добавить, как 1a, 1b, 1c, 2a, 2b, 2c. Но не 1x или 1y, потому что он пропускает второй элемент массива.

Я не могу понять, как изменить ответ, чтобы включить это.

Спасибо, Пси

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Используя подход Джоша Дэвиса в ответе на связанный вопрос:

    $array = array( array('1', '2'), 
                    array('a', 'b', 'c'), 
                    array('m', 'n'), 
                    array('x', 'y'));

    $result = array();
    $php = 'list($a' . implode(',$a', array_keys($array)) . ')=$array;';
    $close_brakets='';
    $r='';
    foreach($array as $k => $v)
    {
        $r .= '$v'.$k;
        $php.='foreach($a'.$k.' as $v'.$k.'){ $result[]="'.$r.'";';
        $close_brakets.="}";
    }

    $php .= $close_brakets;

    eval($php);

    print_r($result);

дает вам нужные комбинации

0 голосов
/ 20 ноября 2009

Хорошо, принимая код, который я изначально использовал, это то, что я придумал, только если кому-то еще интересно

$patterns_array = array();

$php = '';
foreach ($patterns as $i = > $arr)
{
    $php .= 'foreach ($patterns[' . $i . '] as $k' . $i . ' => $v' . $i . '){';
    $tmp = array();
    for($ii=1; $ii<=$i; $ii++){
        $tmp[] = $ii; 
    }
    $php .= '$patterns_array[] = $v'.implode('."::".$v', $tmp).';';
}

$php .= '$patterns_array[] = $v' . implode('."::".$v', array_keys($patterns)) . ';' . str_repeat('}', count($patterns));

eval($php);
0 голосов
/ 18 ноября 2009

Как то так? Идея состоит в том, чтобы зациклить один массив и объединить каждое значение в другом массиве.

// Loop array[0].
for($i=0; $i<count($array[0]); $i++) {
    // Loop array[1]
    for($j=0; $j<count($array[1]); $j++) {
        echo $array[0][$i];
        echo $array[1][$j];
    }
}
...