[PHP] Prioriteiten gebaseerd op attributen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Faisalovic
  • Registratie: Mei 2002
  • Laatst online: 06-09 21:09
Ik ben allereerst geen programmeur en geen wiskunde expert.
Maar heb wel een vraag van een mathematische aard waarvan het antwoord nodig is om hetgeen te bouwen dat ik wil.

Ik heb een filter systeem (ala tweakers pricewatch) gemaakt specifiek voor een bedrijf dat bedrukte producten/relatiegeschenken verkoopt.

Deze kun je hier bezichtigen: *snip* irrelevant en/of spam

In de filter boxes in de bovenstaande site zie je filters en filter attributen die je kunt aanklikken.

Nu is het probleem dat bij bepaalde filter resultaten het minst interessante artikel soms bovenaan staat en het meest interessante onderaan.

HET DOEL is dat elk mogelijk filter resultaat per default gesorteerd word naargelang prioriteiten, dit gebaseerd op attribuut waarden.

Voorbeeld:
Als je in de bovenstaande site in de filter "gestanst handvat" aanklikt, dan krijg je een resultaat van meer dan 100 producten. Daarvan wil ik (bedrijf) dat jij (consument) alle producten met attribuut waarden 2 zijden als eerst te zien krijgt, daarna 30 - 50% etc..

Nu kwam ik op het idee om de prioriteiten aan te duiden door elke attribuut waarde een prioriteitswaarde mee te geven, waarbij 1 het hoogste prioriteit heeft, 2 minder.. etc..
Aan de hand van alle prioriteitswaarden moet dynamisch (aan de hand van code) een output komen met alle mogelijke combinaties. De volgorde van die output bepaalt de prioriteit.

Voorbeeld. Ken ik 2 attributen een prioriteitswaarde toe dan krijg je:
"12,
10,
02,
00"
Waarbij "0" toegekend word aan alle andere attribuut waarden die geen prioriteitswaarden meekrijgen.

Bij 3:
"123,
120,
103,
100,
023,
020,
003,
000"

In ons geval moet de output van de logische expressie er ongeveer zo uit komen te zien:

    Prio
delivery2 zijden30 - 50gestanst 1
delivery2 zijden31 - 50none 2
delivery2 zijdennonegestanst 3
delivery2 zijdennonenone 4
deliverynone30 - 50gestanst 5
deliverynone30 - 50none 6
deliverynonenonegestanst 7
deliverynonenonenone 8
none2 zijden30 - 50gestanst 9
none2 zijden31 - 50none 10
none2 zijdennonegestanst 11
none2 zijdennonenone 12
nonenone30 - 50gestanst 13
nonenone30 - 50none 14
nonenonenonegestanst 15


Onze programmeur komt hier helaas niet uit. Misschien dat jullie kunnen helpen?
Ik heb alleens gegoogled op:
"123, 120, 103, 100, 023, 020, 003, 000"
En las in de resultaten iets over Monad Haskel, heeft dat ermee te maken? Als je dat namelijk googled krijg je artikelen als:
http://stackoverflow.com/...65/combinations-of-a-list

[ Voor 1% gewijzigd door RobIII op 27-02-2015 14:40 ]


Acties:
  • 0 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 15-10 20:58
Als ik het voorbeeld bekijk van wat gewenst is, zie ik geen noodzaak voor ingewikkelde formules, prioriteitswaarden e.d., maar is gewoon recursief sorteren gewenst. Immers volgens je voorbeeld: De eerste helft zijn producten met 'delivery', de tweede helft zijn producten zonder 'delivery'. Van de eerste helft heeft de eerste helft '2 zijden' en de tweede helft 'none'. Van de eerste helft met '2 zijden' is dan gesorteerd op volgorde '30-50', '31-50' en 'none'. Tenslotte is de 'none' gesorteerd op volgorde 'gestanst' en 'none'.

Dat wilt dus zeggen: Laat je programmeur eerst de hele verzameling sorteren op de meest belangrijke eigenschap, vervolgens binnen elk deelverzameling sorteren op de 1 na meest belangrijke eigenschap, vervolgens... (rinse and repeat).

Dus:

    Prio
delivery2 zijden31 - 50none 2
nonenone30 - 50none 14
delivery2 zijdennonegestanst 3
deliverynone30 - 50gestanst 5
none2 zijden31 - 50none 10
deliverynone30 - 50none 6
deliverynonenonenone 8
none2 zijden30 - 50gestanst 9
delivery2 zijdennonenone 4
none2 zijdennonegestanst 11
none2 zijdennonenone 12
delivery2 zijden30 - 50gestanst 1
deliverynonenonegestanst 7
nonenone30 - 50gestanst 13
nonenonenonegestanst 15


wordt

    Prio
delivery2 zijden31 - 50none 2
delivery2 zijdennonegestanst 3
deliverynone30 - 50gestanst 5
deliverynone30 - 50none 6
deliverynonenonenone 8
delivery2 zijdennonenone 4
delivery2 zijden30 - 50gestanst 1
deliverynonenonegestanst 7
nonenone30 - 50none 14
none2 zijden31 - 50none 10
none2 zijden30 - 50gestanst 9
none2 zijdennonegestanst 11
none2 zijdennonenone 12
nonenone30 - 50gestanst 13
nonenonenonegestanst 15


wordt

    Prio
delivery2 zijden31 - 50none 2
delivery2 zijdennonegestanst 3
delivery2 zijdennonenone 4
delivery2 zijden30 - 50gestanst 1
deliverynone30 - 50gestanst 5
deliverynone30 - 50none 6
deliverynonenonenone 8
deliverynonenonegestanst 7
none2 zijden31 - 50none 10
none2 zijden30 - 50gestanst 9
none2 zijdennonegestanst 11
none2 zijdennonenone 12
nonenone30 - 50none 14
nonenone30 - 50gestanst 13
nonenonenonegestanst 15


wordt

    Prio
delivery2 zijden30 - 50gestanst 1
delivery2 zijden31 - 50none 2
delivery2 zijdennonegestanst 3
delivery2 zijdennonenone 4
deliverynone30 - 50gestanst 5
deliverynone30 - 50none 6
deliverynonenonenone 8
deliverynonenonegestanst 7
none2 zijden30 - 50gestanst 9
none2 zijden31 - 50none 10
none2 zijdennonegestanst 11
none2 zijdennonenone 12
nonenone30 - 50none 14
nonenone30 - 50gestanst 13
nonenonenonegestanst 15


wordt

    Prio
delivery2 zijden30 - 50gestanst 1
delivery2 zijden31 - 50none 2
delivery2 zijdennonegestanst 3
delivery2 zijdennonenone 4
deliverynone30 - 50gestanst 5
deliverynone30 - 50none 6
deliverynonenonegestanst 7
deliverynonenonenone 8
none2 zijden30 - 50gestanst 9
none2 zijden31 - 50none 10
none2 zijdennonegestanst 11
none2 zijdennonenone 12
nonenone30 - 50gestanst 13
nonenone30 - 50none 14
nonenonenonegestanst 15

Acties:
  • 0 Henk 'm!

  • Faisalovic
  • Registratie: Mei 2002
  • Laatst online: 06-09 21:09
kutagh schreef op vrijdag 27 februari 2015 @ 13:41:
Als ik het voorbeeld bekijk van wat gewenst is, zie ik geen noodzaak voor ingewikkelde formules, prioriteitswaarden e.d., maar is gewoon recursief sorteren gewenst. Immers volgens je voorbeeld: De eerste helft zijn producten met 'delivery', de tweede helft zijn producten zonder 'delivery'. Van de eerste helft heeft de eerste helft '2 zijden' en de tweede helft 'none'. Van de eerste helft met '2 zijden' is dan gesorteerd op volgorde '30-50', '31-50' en 'none'. Tenslotte is de 'none' gesorteerd op volgorde 'gestanst' en 'none'.

Dat wilt dus zeggen: Laat je programmeur eerst de hele verzameling sorteren op de meest belangrijke eigenschap, vervolgens binnen elk deelverzameling sorteren op de 1 na meest belangrijke eigenschap, vervolgens... (rinse and repeat).
Ha! Thanks for je uitgebreide antwoord.
Ik legde dit voor in het Engels (programmeur in India) inclusief jouw voorbeelden.

In zijn gebroken engels legde hij uit:

"but in my case i dont know which row will get which priority
that is my problem
if i get to know this thing
then it will be really easy"

Nogmaals ik ben geen programmeur maar van wat ik ervan begreep is dat hij niet de logica kan vinden die output in de juiste order zet.

Nu heb ik zelf iets online gevonden en voorgelegd:
http://stackoverflow.com/...-combinations-from-a-list
-------------------------------------------------
def combinations(items):
return ( set(compress(items,mask)) for mask in product(*[[0,1]]*len(items)) )
# alternative: ...in product([0,1], repeat=len(items)) )
Main idea behind this answer: there are 2^N combinations -- same as the number of binary strings of length N. For each binary string, you pick all elements corresponding to a "1".

items=abc * mask=###
|
V
000 ->
001 -> c
010 -> b
011 -> bc
100 -> a
101 -> a c
110 -> ab
111 -> abc
---------------------------------------------
Bovenstaande is gedaan in Phyton gebruikmakend van de Itertools library.
Diezelfde Itertools library blijkt ook beschikbaar voor PHP. De code gaat de programmeur nu vertalen. Ik hoop dat dit m'n issue oplost. Nogmaals dank kutagh.

Acties:
  • 0 Henk 'm!

  • Faisalovic
  • Registratie: Mei 2002
  • Laatst online: 06-09 21:09
Ter afsluiting van dit topic. Itertools library en de gevonden code werken goed voor wat ik wilde.
wij kunnen nu in de database op categorie niveau bijv. aangeven: alle artikelen onder deze categorie krijgen filter attribuut "2 zijden" en "30%-50%" gedrukt, en naargelang de prioriteit in het gegenereerde tabel word er een prioriteits-nummer meegegeven aan de artikelen.