2009-11-18 2 views
0

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

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

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

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

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

Thanks, Psy

+2

Почему именно 1x и 1y не верны? – Ikke

+0

@Ikke: Потому что он не содержит ничего из второго элемента массива, то есть a, b или c. @Bart: Извините, я должен был объяснить ситуацию немного лучше, однако я в той же ситуации, что и OP связанного сообщения, но еще немного, изменил вопрос, чтобы, надеюсь, отразить это. – Psytronic

+0

Я прочитал еще одно сообщение, но на мои вопросы не ответил. Вот почему я спросил. Поэтому позвольте мне спросить еще раз, но теперь с примером. Можете ли вы объяснить, какие комбинации вы ищете, когда ваш массив выглядит так: '$ array = array (array ('1', '2'), array ('a', 'b', 'c'), array ('m', 'n'), array ('x', 'y')); 'Пожалуйста, старайтесь избегать таких терминов, как« и т. д. », перечисляйте все комбинации, пожалуйста. –

ответ

1

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

$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

Спасибо, что не пробовал этот код, на самом деле мне удалось взять мой текущий код и изменить его в конце, однако это тоже работает :) – Psytronic

0

Что-то вроде этого? Идея состоит в объединении одного массива и объединении с каждым значением в другом массиве.

// 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]; 
    } 
} 
+0

Я сомневаюсь, что массив (ы) будет иметь фиксированную длину. –

0

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

 
$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);