| 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: 5 let
|
|||
0