Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Na jakiej zasadzie wyświetlić przedziały cenowe dostępnych produktów?, Jak jest to obmyślane?
kukix
post 27.01.2011, 01:19:22
Post #1





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam.
Dostałem od znajomego zlecenie rozbudowy pewnego skryptu sklepowego o funkcje wyświetlania przedziałów cenowych dostępnych produktów w danej kategorii.
Coś jak np w Ceneo w lewym menu:

  1. poniżej 1013 zł
  2. od 1014 do 2040 zł
  3. od 2041 do 3289 zł
  4. od 3290 do 5210 zł
  5. powyżej 5218 zł


Jak wygenerować takie przedziały? Czy to po prostu dzieli wszystkie dostepne ceny na 4 i wyświwetla z danego przedziału największa i najmniejszą?

Czyli ilości powinny być porównywalne w każdym przedziale, a np na tej stronie widze, że są duze różnice w poszczególnych przedziałach cenowych, czyli produkty nie są tak po prostu dzielone.

Macie może pomysł, jak rozwiązać ta sprawę?
Będę wdzięczny za wszelkie wypowiedzi.

Ten post edytował kukix 27.01.2011, 02:01:15
Go to the top of the page
+Quote Post
emajl22
post 27.01.2011, 01:40:33
Post #2





Grupa: Zarejestrowani
Postów: 273
Pomógł: 21
Dołączył: 28.11.2010

Ostrzeżenie: (10%)
X----


Hmm, a samo " <, > " w zapytaniu nie wystarczy? Oczywiście w klauzuli WHERE.

Przykład:
  1. SELECT * FROM `tabela` WHERE `x` < 'cena' AND `y` > 'cena2'


Ten post edytował emajl22 27.01.2011, 02:01:59


--------------------
Go to the top of the page
+Quote Post
Crozin
post 27.01.2011, 01:48:39
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Na początek:
Kod
# Podsumowanie kategorii
# minimalna - maksymalna cena (ilość stron) - ilość produków
   0,80 - 28824,34 (523) - 10460

# Kolejne filtry cenowe
# minimalna - maksymalna cena (ilość stron) - stosunek ilości stron do ogółu
   0,80 -  1008,00 (302) - 58%
1014,80 -  2040,00 (137) - 26%
2041,60 -  3289,00 (048) -  9%
3290,00 -  5187,00 (024) -  5%
5218,67 - 28824,34 (014) -  3%
Jak widać nie jest to żadna skala liniowa. Raczej wątpię by w innych kategoriach proporcje wyglądały podobnie.
Zapewne przy generowaniu przedziałów pod uwagę brane będzie 80-90% produktów (skrajne ceny zostaną odrzucone, by pojedyncze produkty nie psuły wyników).
Dochodzi druga w nocy i nie chce mi się sprawdzać ale być może przedziały są określane na podstawie jakiejś skali logarytmicznej.
Go to the top of the page
+Quote Post
Pilsener
post 27.01.2011, 10:16:41
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Zagadnienie statystyczne. Dwie skrajne wartości mamy, liczbę przedziałów najlepiej określić jako stałą, co do rozpiętości przedziałów sugeruję korzystać z tego:
http://pl.wikipedia.org/wiki/Rozk%C5%82ad_normalny
Możesz być nawet lepszy od konkurencji i machnąć wykres.
Poczytaj o przedziałach ufności, poziomie istotności, funkcjach gęstości itp. Dzisiaj masz dużo gotowych narzędzi (np. w excelu).
Go to the top of the page
+Quote Post
kukix
post 28.01.2011, 13:50:04
Post #5





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Niestety nie mam wykształcenia matematycznego. Skończyłem administracje :/ Zastanawiam się jakby można było to po chłopsku ogarnąć.

Może zrobić tak. Podzielić wszystkie dostępne ceny na 5 przedziałów.

od 0 do maksymalnej liczby dajmy na to 7688 zł. Jeden przedział wychodzi wtedy 1537zł. Pierwszy przedział można by zrobić mniejszy, ale trzeba to zrobić jakoś uniwersalnie :/

poniżej 200.00 zł (127)
od 200.00 do 400.00 zł (90)
od 400.00 do 1400.00 zł (91)
od 1400.00 do 2600.00 zł (83)
powyżej 2600.00 zł (82)
Go to the top of the page
+Quote Post
Wicepsik
post 28.01.2011, 15:07:15
Post #6





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Ja bym to zrobił tak

  1. <?php
  2. $t = array(22,37,24,1603,1456,69,39,138,138,376,242,242,415,267,
  3. 267,439,268,268,577,251,251,492,1008,1008,1359,280,280,445,489,489,824,
  4. 186,186,320,69,69,153,329,329,539,138,138,236,183,183,300,512,512,949,81,
  5. 81,184,820,820,1089,192,192,414,687,687,1099,349,349,557,653,653,929,489);
  6. $suma = 0;
  7. foreach($t as $v) $suma += $v;
  8. $suma = round($suma / count($t));
  9. foreach($t as $v){
  10. if($v > $suma*3) $r[3]++;
  11. else if($v > $suma*2) $r[2]++;
  12. else if($v > $suma) $r[1]++;
  13. else $r[0]++;
  14. }
  15. for($i=0;$i<4;$i++){
  16. if($i==0) echo '<br>poniżej '.$suma.' zł ('.$r[$i].')<br>';
  17. else if($i==3) echo 'powyżej '.($suma*3+1).' zł ('.$r[$i].')<br>';
  18. else echo 'od '.($suma*$i+1).' do '.($suma*($i+1)).' zł ('.$r[$i].')<br>';
  19. }
  20. ?>


Wynik
Kod
poniżej 437 zł (41)
od 438 do 874 zł (18)
od 875 do 1311 zł (6)
powyżej 1312 zł (3)


Tak na szybko zrobiłem

Ten post edytował Wicepsik 28.01.2011, 15:07:45


--------------------
Go to the top of the page
+Quote Post
Pilsener
post 28.01.2011, 15:25:13
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


No i co, poniżej 437 masz aż 41, czyli najliczniejsza grupa nie jest podzielona...

Po chłopsku mówisz? Jeśli chcesz wprowadzić stałą liczbę przedziałów to ja bym Ci radził też dać stałą liczbę elementów na przedział, czyli jeśli masz np. 100 telewizorów to będzie wychodziło po 20 na przedział i wyglądało to będzie mniej więcej tak:
1. < 400 zł - 20
2. 400-450 zł - 20
3. 450-470 - 20
4. 470-560 - 20
5. 560 < - 20

To będzie najprostsze do zrobienia i przejrzyste dla użytkowników.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 02:15