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} } 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 |
#2 · Zasláno: 6. 4. 2021, 15:15:33
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))); |
||
Časová prodleva: 3 roky
|
0