Sziasztok!
Pár napja már kínlódok egy modul megrásával. Ebben szeretném a segítségeteket kérni. A modul lényege, hogy van egy webshop és ha a user kiválaszt egy adott terméket akkor alul egy részben 6db hasonló terméknek kellene megjelennie. A hasonlóságot a szerző, kiadó, stb alapján álapítanám meg. Először nézem a saját nyelv és saját kategóriájában, majd ha bnem jön össze a 6db akkor más nyelvben és más kategóriában is lehet keresni.
Igazából az anomálikkáal van a gondom. Mivel több szűröben is átmegy ezért előfordul, hogy megtalálja a másik szűrő is azt az elemet amit az előző szűrők már megtaláltak. Viszont minden elemet csak egyszer szeretnék felvenni.
Erre valakinek van ötlete, hogy hogyan lehet ezt megoldani? Ha több infó kell akkor írom.
- 1697 megtekintés
Hozzászólások
Anelkul, hogy ertenem pontosan mi is a problemad: egy megtalalt termek melle generalj le egy md5sum-ot, aztan ha az osszes filteren vegigment a vezerles, akkor distinct-elj a checksum szerint. Mindegyikbol marad egy peldany. De sorry, ha nagyon nem ertem mit szeretnel. :)
- A hozzászóláshoz be kell jelentkezni
Megprbálom akkor röviden összefoglalni.
Adott egy termék amit éppen a user néz. Ennek a terméknek vannak tulajdonságai: szerző, kiadó, korosztály, stb...
Mondjuk ez a termék egy angol-cd.
Ahogy én gobdoltam eddig. Felállítottam egy szűrőt mysql-ben ami LIKE paraméterrel hasonló termékek után keres, persze ezt a terméket kihagyva.
Ha kevesebb találat van min 6db akkor a következő szűrőre ugrik. Itt jönnek a gondok. Lehet, hogy az én tudatlanságom, de előfordulhat az az eset, hogy olyan terméket talál meg ez a szűrő is ami már szerepelt az előző szűrőkben. Ezért kellene valami olyan megoldás ami ezt az anomáliát megoldja. Minden egyes szűrő eredményeit egy tömbben tároltam el. Ezekből a tömbökből kellene az adatokat úgy összerakni egy eredmény tömbbe, hogy minden elem csak egyszer forduljon elő. A tömbök asszociatív tömbök.
- A hozzászóláshoz be kell jelentkezni
Szia!
Mivel nem olyan sok dolgot kell megjeleníteni, én az összes megtalált terméket elhelyezném egy tömbben. Aztán a későbbi szűrők leellenőriznék, hogy a talált termék szerepel-e már a tömbben. Ha igen, akkor nem teszi bele.
A szűrés végeztével pedig megjeleníted a tömb tartalmát.
- A hozzászóláshoz be kell jelentkezni
Én is így serettem volna megcsinálni, de belekeveredtem mint nyuszi a hurokba. Vagyis nem igazán sikerült még ezt megoldanom. Van rá ötleted?
- A hozzászóláshoz be kell jelentkezni
Nem tudom, hogy egy terméknek mely tulajdonságait szeretnéd megjeleníteni, de én így csinálnám:
2 dimenziós tömb lenne. Minden belső tömb kulcsa az egyes termékek id-je lenne. A belső tömbök tartalmaznák a termékek tulajdonságait.
Szűréskor pedig csupán meg kellene nézni, hogy a talált termék id-je szerepel-e már a tömb kulcsai között.
- A hozzászóláshoz be kell jelentkezni
$j[] = array('termekkod' => $x['termekkod'], 'termeknev' => $x['termeknev'], 'szerzo' => $x['szerzo'], 'kiado' => $x['kiado'], 'sorozat' => $x['sorozat'], 'nyelv' => $x['nyelv'], 'korosztaly' => $x['korosztaly'], 'kivite' => $x['kivitel'], 'jatekido' => $x['jatekido'], 'meret' => $x['meret'], 'oldalszam' => $x['oldalszam'], 'szallitas' => $x['szallitas'], 'ar' => $x['ar'], 'akcios_ar' => $x['akcios_ar'], 'bonuszpont' => $x['bonuszpont'], 'rov_leiras' => $x['rov_leiras'], 'reszl_leiras' => $x['reszl_leiras'], 'alkategoria' => $x['alkategoria']);
Ilyen típusúak a tömbök melyeket egy while ciklusal állítok elő. Ilyen tömbből annyi van amennyi szűrő. És ezekből a tömbökből kellene összegyúrni egyet, úgy hogy minden elem csak egyszer szerepeljen.
- A hozzászóláshoz be kell jelentkezni
Hát én a helyedben csak egy tömböt vezetnék be, amit aztán minden szűrő használna. Így nézne ki:
$j[$x['termekkod']] = array('termeknev' => $x['termeknev'], 'szerzo' => $x['szerzo'], 'kiado' => $x['kiado'],
'sorozat' => $x['sorozat'], 'nyelv' => $x['nyelv'], 'korosztaly' => $x['korosztaly'], 'kivite' => $x['kivitel'],
'jatekido' => $x['jatekido'], 'meret' => $x['meret'], 'oldalszam' => $x['oldalszam'], 'szallitas' => $x['szallitas'],
'ar' => $x['ar'], 'akcios_ar' => $x['akcios_ar'], 'bonuszpont' => $x['bonuszpont'], 'rov_leiras' => $x['rov_leiras'],
'reszl_leiras' => $x['reszl_leiras'], 'alkategoria' => $x['alkategoria']);
És mivel a termékkód lenne a key, könnyen ellenőrizhető lenne, hogy mit tartalmaz.
- A hozzászóláshoz be kell jelentkezni
Ez megoldásnak bizonyult. Az array_key_exists függvénnyel pedig ellenőriztem, hogy van e már ilyen kulcs. Ha nincs akkor hozzáfűztem a tömbhöz, ellenkező esetben nem.
Köszönöm mindenkinek.
- A hozzászóláshoz be kell jelentkezni
kijon egy termek id az egyik szurobol, a kovetkezonek meg megadod, AND ID!=talat id
- A hozzászóláshoz be kell jelentkezni
Sokat segítene, ha bemásolnád hogyan néz ki a tömb.
Ez talán segíthet.
- A hozzászóláshoz be kell jelentkezni
Ezt már próbáltam, de az én tömbömre ez nem használható mivel a végén csak egy elemt hagy meg.
- A hozzászóláshoz be kell jelentkezni
hashmap, select distinct ?
Eléggé alulspecifikált a problémád...
- A hozzászóláshoz be kell jelentkezni
Csak egy megjegyzés: ennek a topic-nak semmi köze a php modul íráshoz, ez egy picsa egyzserű programozási kérdés. Függetlenül attól, h modul írás közben futottál bele.
Ha a termék adatbázis kicsi és/vagy jól van indexelve, akkor én nem bohóckodnék tömbökkel hanem union-okkal végigcsapnám limit 6.
Lehet h union se kell neki, hanem leég kihagyni a nyelvet a where-ből és csak order by nyelv=keresett_nyelv, stb.
Egyébként ha sok kis query-vel kell megírni (gyakran célszerű) akkor:
$idlist = $nezett_termek_id
$res = myq ("select ..where ... and id not in ($idlist) limit 6");
if mynumrows()<6{
while ($row=fetchrow()){
//tömbös bohóckodás is
$idlist .= ", ".$row[termek_id]}
$res = myq ("select ..where ... and id not in ($idlist) limit 6");
...
}
- A hozzászóláshoz be kell jelentkezni
Amit Te szeretnél az a DISTINCT kulcsszó. Remélhetőleg minden terméknek van egy ID-je. Kiveszed a paramétereknek megfelelő DISTINCT id-t, majd visszafele lekérdezed az ahhoz az ID-hez tartozó összes tulajdonságot. Hogy ne legyen nagyon lassú, az utóbbit szépen be lehet cachelni.
- A hozzászóláshoz be kell jelentkezni
Szerintem eszedbe ne jusson a tömb, hacsak nem akarsz forgalmi dugót az SQL szerver irányába.
Én a következőképpen oldanám meg:
Először az első keresési feltétel szerint berántanék 6db elemet.
Ha nincs meg a 6db, akkor $talált mennyiségű elem van (pl. 4)
A következő keresésben (6+$talált) mennyiségű elemet rántanék be.
Aztán abból a (6+$talált)-ból megpróbálnám kipótolni azt a $talált mennyiségű elemet úgy, hogy közben ellenőrzöm, hogy nem volt-e már ez az elem az első keresésben is találat.
Szerinem ez a legkölségkímélőbb megoldás.
- A hozzászóláshoz be kell jelentkezni
És a kapott adatokat miben tárolnád ha nem tömbben?
- A hozzászóláshoz be kell jelentkezni