2012-03-31 3 views
0

У меня есть 2 списка:Получение всех возможных комбинаций 2 списков

  • List1 имеет элементы (а, б, в, г, д)
  • List2 имеет элементы (1,2,3)

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

  • Combinaton 1: a1, b2, с3, dNULL, eNULL
  • Комбинация 2: a1, bNULL, c2, d3, eNULL

И так далее. Длина списков динамическая. Как написать функцию в PHP, необходимую для решения этой проблемы?

+0

Я предполагаю, что более короткий список будет заполнен значениями «null», правильно? – Gumbo

ответ

0

Это называется «декартово произведение», справочная страница php на массивах http://php.net/manual/en/ref.array.php показывает некоторые реализации (в комментариях).

function array_cartesian() { 
    $_ = func_get_args(); 
    if(count($_) == 0) 
     return array(array()); 
    $a = array_shift($_); 
    $c = call_user_func_array(__FUNCTION__, $_); 
    $r = array(); 
    foreach($a as $v) 
     foreach($c as $p) 
      $r[] = array_merge(array($v), $p); 
    return $r; 
} 

Пример:

$cross = array_cartesian(
    array('apples', 'pears', 'oranges'), 
    array('steve', 'bob') 
); 

Чтобы увидеть результаты:

print_r($cross); 
+0

Набор не состоит из двух списков. – Gumbo

+0

Итак, я обновил свой ответ. – msigman

+0

offtop: '$ _' является лучшим именем переменной когда-либо .. – meze

1

Простой вложенный цикл работает:

$sets = array(); 
foreach ($list1 as $elm1){ 
    foreach ($list2 as $elm2){ 
     $sets[] = array($elm1, $elm2); 
    } 
} 

Если вам нужны пустые версии тоже коврик сначала массивы:

$max = max(count($list1), count($list2)); 
$list1 = array_pad($list1, $max, null); 
$list2 = array_pad($list2, $max, null); 
+0

Благодарим за помощь. Но это действительно не помогает. Каждая комбинация должна соединять все элементы. Не только один элемент массивов. – user1305579

+0

Я не понимаю, что вы имеете в виду. Можете ли вы дать полный пример с ожидаемым выходом? – Cal

0

1 - получить все перестановки list1 как Х, длинный список

2-- для каждого элемента X, создать отображение на list2

3 - временная сложность: X * list2

Смежные вопросы