Как найти все возможные комбинации массивов в PHP

$data = array( 'a' => array('a1', 'a2', 'a3'), 'b' => array('b1', 'b2', 'b3', 'b4'), 'c' => array('c1', 'c2', 'c3', 'c4', 'c5')); 

получить

 a1 a2 a3 b1 b2 b3 b4 c1 c2 c3 c4 c5 a1 b1 a1 b2 a1 b3 a1 b4 a1 c1 a1 c2 a1 c3 a1 c4 a1 c5 b1 c1 b1 c2 b1 c3 b1 c4 b1 c5 b2 c1 b2 c2 b2 c3 b2 c4 b2 c5 b3 c1 b3 c2 b3 c3 b3 c4 b3 c5 b4 c1 b4 c2 b4 c3 b4 c4 b4 c5 a1 b1 c1 a1 b1 c2 a1 b1 c3 a1 b1 c4 a1 b1 c5 a1 b2 c1 a1 b2 c2 a1 b2 c3 a1 b2 c4 a1 b2 c5 a1 b3 c1 a1 b3 c2 a1 b3 c3 a1 b3 c4 a1 b3 c5 a1 b4 c1 a1 b4 c2 a1 b4 c3 a1 b4 c4 a1 b4 c5 etc... 

благодаря

По-видимому, вы хотите построить декартово произведение нескольких массивов, т. Е. Каждый элемент, объединенный друг с другом.

Кроме того, вы хотите иметь кортежи с результатами, которые пропускают один или несколько из тех массивов, которые для простоты я бы моделировал как имеющий null элемент в каждом из этих массивов:

 $result = array(array()); // We need to start with one element already, because thats the identity element of the cartesian product foreach ($data as $arr) { array_push($arr,null); // Add a null element to the array to get tuples with less than all arrays // This is the cartesian product: $new_result = array(); foreach ($result as $old_element) foreach ($arr as $el) $new_result []= array_merge($old_element,array($el)); $result = $new_result; } 

Обратите внимание, что для вашей строки результатов a1 b3 c2 этот код дает вам array('a1','b3','c2') а для вашей строки результатов b4 c3 этот код дает вам array('b4','c3',null) ,

Если вы хотите распечатать их все, просто используйте циклы:

 foreach($data['a'] as $k1 =>$v1){ $output[]=$v1; foreach($data['b'] as $k2 => $v2){ $output[]=$v2; $output[]=$v1."-".$v2; foreach($data['c'] as $k3 => $v3){ $output[]=$v3; $output[]=$v1."-".$v2."-".$v3; } } } 

http://www.webdeveloper.com/forum/showthread.php?t=168409

Google такой потрясающий …

Если вы хотите увидеть, сколько возможностей есть, умножьте их:

 $count1=1; $count2=1; for each $data as $item{ $count2*=count($item); }