How to generate in PHP all combinations of items in multiple arrays How to generate in PHP all combinations of items in multiple arrays arrays arrays

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