Autor Zpráva
Toník
Profil *
Zdravím,

chtěl bych poprosit o radu s vytvořením kombinací polí u produktu.

Mám předdefinované varianty ( Oblečení => "Barva => Bíla, Hnědá, Černá..", "Velikost" => "XL, S, L, M...", "Látka" => "Bavlna, polyester.." )
A u produktu vytvářím kombinace variant pro skupiny (př. Oblečení)

příklad mám:
foreach skupiny ($vgroup)...
foreach typů ($var) ...a $subv.id => id varianty (př. XL)
{
<input type="checkbox" name='variants[{$vgroup.id}][{$var.id}][]' value='{$subv.id}'  > {$subv.name}
}
<input type="submit" name="send" value="Vytvořit varianty">

tedy nyní mám vše v $_POST["variants"].
S čím si nevím rady je nějaké mapování/vytvoření kombinací.

Potřebuji vytvořit všechny možné kombinace, zároveň ale, aby tam nebyly samostatné...

Tj. když vyberu pouze "Bílá, Modrá" a velikost "XL, XS, S"
Tak aby to vytvořilo

1 => array( 1,6 ) // Barva bílá, Velikost XL
2 => array (1, 10 ) // Barva bíla, velikost XS,
....atd..
Tedy celkem 6 variant v této kombinaci.

Dokázal by prosím někdo poradit?


Tak jsem nakonec našel tuto funkci - vypadá to že by mohla fungovat jak bych potřeboval

function cartesian($input) {
    $input = array_filter($input);
    $result = array(array());
    foreach ($input as $key => $values) {
        $append = array();
        foreach($result as $product) {
            foreach($values as $item) {
                $product[$key] = $item;
                $append[] = $product;
            }
        }
        $result = $append;
    }
    return $result;
}
Keeehi
Profil
To fungovat bude. Dá se to taky zapsat rekurzivně.
function cartesian($input) {
    if (count($input) === 1) {
        return array_map(function ($v) { return [$v]; }, array_values(current($input)));
    }

    $r = [];
    foreach (array_pop($input) as $item) {
        $r = array_merge($r, array_map(function ($v) use ($item) { return array_merge($v, [$item]); }, cartesian($input)));
    }
    return $r;
}

Nebo taky jako generátor
function cartesian($input) {
    if (count($input) === 1)
        foreach (current($input) as $v)
            yield [$v];
    else
        foreach (array_pop($input) as $item)
            foreach (cartesian($input) as $r)
                yield array_merge([$item], $r);
}

Ten při každém "zavolání" vrátí jednu položku. Používá se takto.
foreach (cartesian($input) as $oneItem) {
    var_dump($oneItem);
}

Pokud z toho generátoru potřebuješ vyrobit klasické pole, tak stačí použít funkci iterator_to_array
var_dump(iterator_to_array(cartesian($input)));

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0