How to generate in PHP all combinations of items in multiple arrays
Here is recursive solution:
function combinations($arrays, $i = 0) { if (!isset($arrays[$i])) { return array(); } if ($i == count($arrays) - 1) { return $arrays[$i]; } // get combinations from subsequent arrays $tmp = combinations($arrays, $i + 1); $result = array(); // concat each array from tmp with each element from $arrays[$i] foreach ($arrays[$i] as $v) { foreach ($tmp as $t) { $result[] = is_array($t) ? array_merge(array($v), $t) : array($v, $t); } } return $result;}print_r( combinations( array( array('A1','A2','A3'), array('B1','B2','B3'), array('C1','C2') ) ));
This is a cartesian product, and I just asked the same question not too long ago. Here is the algorithm that is posted on the PHP website.
function array_cartesian_product($arrays){ $result = array(); $arrays = array_values($arrays); $sizeIn = sizeof($arrays); $size = $sizeIn > 0 ? 1 : 0; foreach ($arrays as $array) $size = $size * sizeof($array); for ($i = 0; $i < $size; $i ++) { $result[$i] = array(); for ($j = 0; $j < $sizeIn; $j ++) array_push($result[$i], current($arrays[$j])); for ($j = ($sizeIn -1); $j >= 0; $j --) { if (next($arrays[$j])) break; elseif (isset ($arrays[$j])) reset($arrays[$j]); } } return $result;}
This code besides simplicity, get all combinations of multiple arrays and preserves keys.
function get_combinations($arrays) { $result = array(array()); foreach ($arrays as $property => $property_values) { $tmp = array(); foreach ($result as $result_item) { foreach ($property_values as $property_key => $property_value) { $tmp[] = $result_item + array($property_key => $property_value); } } $result = $tmp; } return $result;}
Exemple:
Array( Array ( '1' => 'White', '2' => 'Green', '3' => 'Blue' ), Array ( '4' =>' Small', '5' => 'Big' ))
Will return:
Array( [0] => Array ( [1] => White [4] => Small ) [1] => Array ( [1] => White [5] => Big ) [2] => Array ( [2] => Green [4] => Small ) [3] => Array ( [2] => Green [5] => Big ) [4] => Array ( [3] => Blue [4] => Small ) [5] => Array ( [3] => Blue [5] => Big ))