Iloczyn Kartezjański

Utworzone przez Marcin Dąbrowski dnia środa, 14 kwietnia 2021

Funkcja zwracająca wszystkie kombinacje z wszystkich wariantów dla produktów z zadanych tablic

Funkcja zwróci wszystkie kombinacje z x tablic podanych jako parametry. Przydatne, jeśli potrzebujemy uzyskać wszystkie kombinacje dla produktów. W przykładzie mamy 3 produkty które występują w 3 rozmiarach i chcielibyśmy zwrócić wszystkie kombinacje tych możłiwości

Wikipedia - Iloczyn Kartezjanski

function arrayCartesianFromArrays(array $arrays) 
{
    $result = [];
    $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;
}

// Use example 
$arrays = [
    ['Product1', 'Product2','Product3'],
    ['red', 'green','blue'], 
    ['L','XL','XXL'], 
]; 
$output = arrayCartesianFromArrays($arrays);    
print_r($output);

Rezultat

Array
(
    [0] => Array
        (
            [0] => Product1
            [1] => red
            [2] => L
        )

    [1] => Array
        (
            [0] => Product1
            [1] => red
            [2] => XL
        )

    [2] => Array
        (
            [0] => Product1
            [1] => red
            [2] => XXL
        )

    [3] => Array
        (
            [0] => Product1
            [1] => green
            [2] => L
        )

    [4] => Array
        (
            [0] => Product1
            [1] => green
            [2] => XL
        )

    [5] => Array
        (
            [0] => Product1
            [1] => green
            [2] => XXL
        )

    [6] => Array
        (
            [0] => Product1
            [1] => blue
            [2] => L
        )

    [7] => Array
        (
            [0] => Product1
            [1] => blue
            [2] => XL
        )

    [8] => Array
        (
            [0] => Product1
            [1] => blue
            [2] => XXL
        )

     ... 

    [25] => Array
        (
            [0] => Product3
            [1] => blue
            [2] => XL
        )

    [26] => Array
        (
            [0] => Product3
            [1] => blue
            [2] => XXL
        )

)