Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sklep www a kombinacje cech produktów
Forum PHP.pl > Forum > PHP
darkking
Witajcie,
pisząc swój własny sklep internetowy natrafiłem na pewien problem, a mianowicie chodzi o strukturę bazy danych oraz skryptu, który pozwalałby na tworzenie dowolnych kombinacji cech dla każdego produktu. Załóżmy, że posiadamy produkt "x", który posiada np. 3 cechy lub parametry takie jak: rozmiar(S,M,L), kolor(czerwony, niebieski), rodzaj materiału(plastik, chrom, srebro). Daje nam to 3*2*3 = 18 kombinacji. Założeniem jest to aby każda kombinacja mogła mieć inną cenę, wagę itp. (tak jak w prestaShop). Wracając do pytania, jak to zrobić aby działało szybko i zajmowało mało miejsca w tabeli ?
CuteOne
product
product_id | product_opis
1 | Koszulka

fields_category
cat_id | cat_name
1 | Rozmiar
2 | Kolor

fields
field_id | cat_id | field_value
1 | 1 | X
2 | 1 | XXL
1 | 2 | Czerowny

product_opis
id | product_id | cat_id
1 | 1 | 1
2 | 1 | 2

Pobierasz produkt o id 1 JOIN'em podczepiasz kategorie do produktu, JOIN'em podczepiasz wartości do kategorii.
darkking
Ok, dziękuję. A jak w php stworzyć wszystkie gotowe kombinacje atrybutów ?
CuteOne
Do tabeli product dodaj kolumnę cena_podstawowa czyli taka bez dodatków = 100%, do tabeli fields dodaj cena_cecha gdzie będziesz składował ceny dodatków(inny kolor, rozmiar). Po pobraniu danych dla każdej kategorii tworzysz pole radio, select lub checkbox (wedle uznania). Przy odbieraniu danych wysłanych formularzem zostaje czysta arytmetyka ;p
darkking
Nie chodziło mi o to smile.gif Załóżmy, że mam multiselect z tymi atrybutami:
Kolor
- Czerwony (selected)
- Niebieski (selected)
Rozmiar:
- XL (selected)
- L (selected)
- S (selected)
- M (selected)
Jak teraz w php stworzyć te 8 kombinacji ?
CuteOne
Yyyyy serio nie wiem o co ci chodzi smile.gif co wg Ciebie znaczy "stworzyć w PHP 8 kombinacji" ?
darkking
Tzn. powiązać ze sobą elementy obu tych kategorii czyli:
Czerwony - XL
Czerwony - L
Czerwony - S
Czerwony - M
Niebieski - XL
Niebieski - L
itd. Z założenia tych kategorii może być bardzo dużo, więc trudność sprawia mi napisanie funkcji rekurencyjnej, która stworzyła by takie kombinacje.
sebekzosw
  1. $array[] = array('XL', 'L', 'S', 'M');
  2. $array[] = array('Niebieski', 'Czerwony');
  3.  
  4. function printRecursive($array, $index = 0, $str = '')
  5. {
  6. if($index < count($array) - 1)
  7. {
  8. foreach($array[$index] as $value)
  9. printRecursive($array, $index + 1, $str.$value);
  10. } else
  11. {
  12. foreach($array[$index] as $value)
  13. {
  14. echo $str;
  15. echo $value;
  16. echo "\n";
  17. }
  18. }
  19. }


Źródło: http://forum.php.pl/index.php?s=&showt...st&p=792551

inne rozwiązanie:

  1. $array[] = array('XL', 'L', 'S', 'M');
  2. $array[] = array('Niebieski', 'Czerwony');
  3.  
  4. $keys = array_keys($array);
  5. $values = array();
  6. foreach($array as $val)
  7. $values[] = array_values($val);
  8.  
  9. $numTypes = count($keys);
  10.  
  11. $numTotal = 1;
  12. $switch = array(0 => 1);
  13. $result = array();
  14.  
  15. for($i = 0; $i < $numTypes; $i++)
  16. {
  17. $tmp = count($values[$i]);
  18. $switch[$i + 1] = $switch[$i] * $tmp;
  19. $numTotal *= $tmp;
  20. }
  21.  
  22. for($i = 0; $i < $numTotal; $i++)
  23. {
  24. for($j = 0; $j < $numTypes; $j++)
  25. $result[$j] = $values[$j][floor($i / $switch[$j]) % count($values[$j])];
  26.  
  27. echo implode(', ', $result)."<br>";
  28. }


Źródło: http://forum.php.pl/index.php?s=&showt...st&p=110607

Jeszcze jedno rozwiązanie:

  1. $array[1] = array('XL', 'L', 'S', 'M');
  2. $array[2] = array('Niebieski', 'Czerwony');
  3.  
  4. function Kombinacje($n, $txt)
  5. {
  6. global $array;
  7. foreach($array[$n] as $b)
  8. if(isset($array[$n + 1]))
  9. Kombinacje($n + 1, $txt.' '.$b);
  10. else
  11. echo $txt.' '.$b.'<br />';
  12. }
  13.  
  14. Kombinacje(1, '');


Źródło: http://www.forum.optymalizacja.com/topic/4...cy/#entry371212

  1. function array_cartesian()
  2. {
  3. $_ = func_get_args();
  4. if(count($_) == 0)
  5. return array(array());
  6. $a = array_shift($_);
  7. $c = call_user_func_array(__function__, $_);
  8. $r = array();
  9. foreach($a as $v)
  10. foreach($c as $p)
  11. $r[] = array_merge(array($v), $p);
  12. return $r;
  13. }
  14.  
  15. array_cartesian(array('XL', 'L', 'S', 'M'), array('Niebieski', 'Czerwony'));


Źródło: http://stackoverflow.com/questions/2516599...2516779#2516779
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.