rendezés a felhasználó kedvtelése szerint - quicksort
Van egy tömböm, ami gyümölcsnevekből áll. pl: array("banán", "citrom", "eper", "dinnye", "alma")
Egy körben megkérdezem a felhasználót, hogy melyiket szereted jobban, a ....-t vagy a ....-t, a .... helyén persze egy-egy gyümölcs van a tömbből. És pár kérdés(lehetőleg minnél kevesebb kérdés) után megadom neki, hogy mi a "szeretési listája". A rendezést ugye quicksorttal lehet a leggyorsabban(legkevesebb kérdéssel) megcsinálni, de a PHP program, amit láttam quicksorthoz, számokat rendez nagyság szerint. Hogy alakítsam át? Addig ok, hogy a változókat SESSION-be teszem, de hogy ugorjak bele a ciklus közepébe?
Ez a program, ami számokat rendez(a változókat már session-be rakva)
■ Egy körben megkérdezem a felhasználót, hogy melyiket szereted jobban, a ....-t vagy a ....-t, a .... helyén persze egy-egy gyümölcs van a tömbből. És pár kérdés(lehetőleg minnél kevesebb kérdés) után megadom neki, hogy mi a "szeretési listája". A rendezést ugye quicksorttal lehet a leggyorsabban(legkevesebb kérdéssel) megcsinálni, de a PHP program, amit láttam quicksorthoz, számokat rendez nagyság szerint. Hogy alakítsam át? Addig ok, hogy a változókat SESSION-be teszem, de hogy ugorjak bele a ciklus közepébe?
Ez a program, ami számokat rendez(a változókat már session-be rakva)
<?php
$_SESSION['array'] = array(8, 9, 1, 176, -45, 27, 99, 31, 15, 35, 88, 74, 0 );
$_SESSION['cur'] = 1;
$_SESSION['stack'][1]['l'] = 0;
$_SESSION['stack'][1]['r'] = count($_SESSION['array'])-1;
while ($_SESSION['cur'] != 0 ) {
$_SESSION['l'] = $_SESSION['stack'][$_SESSION['cur']]['l'];
$_SESSION['r'] = $_SESSION['stack'][$_SESSION['cur']]['r'];
$_SESSION['cur']--;
while ($_SESSION['l'] < $_SESSION['r'] ) {
$_SESSION['i'] = $_SESSION['l'];
$_SESSION['j'] = $_SESSION['r'];
$_SESSION['tmp'] = $_SESSION['array'][(int)( ($_SESSION['l']+$_SESSION['r'])/2 )];
// partion the array in two parts.
// left from $_SESSION['tmp'] are with smaller values,
// right from $_SESSION['tmp'] are with bigger ones
while ($_SESSION['i'] <= $_SESSION['j'] ) {
while ($_SESSION['array'][$_SESSION['i']] < $_SESSION['tmp'] ) {
$_SESSION['i']++;
}
while ($_SESSION['tmp'] < $_SESSION['array'][$_SESSION['j']] ) {
$_SESSION['j']--;
}
// swap elements from the two sides
if ($_SESSION['i'] <= $_SESSION['j'] ) {
$_SESSION['w'] = $_SESSION['array'][$_SESSION['i']];
$_SESSION['array'][$_SESSION['i']] = $_SESSION['array'][$_SESSION['j']];
$_SESSION['array'][$_SESSION['j']] = $_SESSION['w'];
$_SESSION['i']++;
$_SESSION['j']--;
}
}
if ($_SESSION['i'] < $_SESSION['r'] ) {
$_SESSION['cur']++;
$_SESSION['stack'][$_SESSION['cur']]['l'] = $_SESSION['i'];
$_SESSION['stack'][$_SESSION['cur']]['r'] = $_SESSION['r'];
}
$_SESSION['r'] = $_SESSION['j'];
}
}
print_r($_SESSION['array']);
?>
Ne ugorj bele
Szóval én úgy csinálnám, hogy begyűjteném a felhasználótól a sorrendre adott válaszait, és amikor az algoritmus olyan párra kérdez rá, amire a felhasználó még nem adott választ, akkor kérdeznék, egyébként a korábbi válasz alapján hagynám rendezni.
Ja és minden válasz után előlről újraindítanám a rendezést, vélhetően nem lesz olyan sok elem, hogy túl sokáig fusson, egyébként a felhasználó kap hülyét :-)
Norbi
xxx
Köszönettel: Dávid
De mégis szerintem megkérdezi
Itt van pl. ez a rész a kódodból:
Erre gondolok, szerintem így megoldható.
Érdekel annyira a probléma, hogy meg is írnám, de sajnos még dolgozom :-( Majd máskor.
Norbi
?????
Rossz volt a példa, de
igen
Dávid
Igazad lenne, de
Szóval még 1x az én elképzelésem:
- minden felhasználói válasz után újraindítod a rendezést, mivel a közepébe beleugrani nem tudsz (tehát az egyszer eldöntött sorrendet is újra-és-újra ellenőrizni fogod)
- a felhasználó válaszait rendre megjegyzed (mondjuk session változókban), és ezt használod a rendezés során, ha rendelkezésre áll
- ha az adott 2 elem sorrendjére nincs még tárolt felhasználói válasz, akkor kirakod az űrlapot, és megvárod a választ
Továbbá egyetértek a többiek hozzászólásával is: magát a rendezést nem kódolnám le újra, hanem az usort függvénnyel rendeznék, és igénybe venném a callback lehetőséget az összehasonlításra.
Norbi
Ps: közben annyira bizgatta a dolog a fantáziámat, hogy megírtam (kb. 10 perc volt...), és gyönyörűen működik, mindet csak egyszer kérdez meg. Nem túl szép, nincs agyon-optimalizálva, de működik. Viszont nem akarom elrontani az örömödet, úgyhogy nem másolom ide. Legfeljebb ha ragaszkodsz hozzá... :-)
megpróbálom
Dávid
MŰKÖDIK
KÖSZI A SEGÍTSÉGET!!!
sort
dasdasd
Bevallom nem nagyon értem mi alapján rendezed a tömbödet
Minek belekavarni a SESSION változókat? Ha olyan értékekre van szükség amik lépésről lépésre változnak (oldaltöltésről oldaltöltésre) akkor is használhatsz $_POST vagy $_GET változókat (ha jól értettem vmi űrlapos kérdezősködésről van szó). Ha meg csak kiértékelésről van szó, és SESSIONben tárolod az eredményt, elég csak a végeredményt abba rakni.
Ha már tömb rendezésről van szó használd az array_multisort(); gyönyörűséges függvényt, amivel több tömb alapján is, oda-vissza, keresztbe és átlósan :) is tudsz rendezni. Szerintem felesleges újra feltalálni a spanyolviaszt, ha a php már megtette...
hát így
Nem lenne jobb egy draganddrop?