Avatar billede weeelo Nybegynder
16. august 2006 - 14:54 Der er 8 kommentarer og
1 løsning

Problemer med sortering..

Hejsa,

Jeg har et MySQL-udtræk, hvor ca. 20 rækker printes ud og sorteres efter en bestemt talværdi.

Herefter trækker jeg manuelt et tal fra én af rækkerne og det kan også sagtens lade sig gøre, men så kan sorteringen fra udtrækket ikke længere følge med selvfølgelig.

Dvs. at har jeg 20 rækker, hvor alle har tallet 10, og derefter trækkes der 5 fra én af rækkerne, hvordan skal jeg så resortere mine rækker, således at de stadig sorteres efter talværdien?

Sådan her ser min kode ud:

$result  =  mysql_query("$sql")or die(mysql_error());
for ($i=1; $r  =  mysql_fetch_array($result); $i++){
if($r[id] == '3') $r[tal] = $r[tal]-5;

MVH Weeelo
Avatar billede coderdk Praktikant
16. august 2006 - 15:05 #1
Gem rækkerne i et array og sortér det resulterende array med usort:
http://dk.php.net/usort
Avatar billede weeelo Nybegynder
16. august 2006 - 15:38 #2
$result = mysql_query($sql);   
for ($i=1; $r  =  mysql_fetch_array($result); $i++){
if($r[id] == '3') $r[tal] = $r[tal]-5;
$array = array();
{
  array_push($array,$r[points]);
}
function cmp($a, $b)
{
  if ($a == $b) {
      return 0;
  }
  return ($a < $b) ? -1 : 1;
}

$a = $array;

usort($a, "cmp");

while (list($key, $value) = each($a)) {
  echo "$key: $value\n";
}

Giver følgende:

0: -5
Fatal error: Cannot redeclare cmp() (previously declared in C:\Domains\wwwroot\new\test.php:85) in C:\Domains\wwwroot\new\test.php on line 85

function cmp($a, $b) er linie 85..
Avatar billede coderdk Praktikant
16. august 2006 - 15:51 #3
Giver heller ikke så meget mening, det du har skrevet ;) Du deklarerer en funktion i en løkke ;) Prøv med:

function cmp($a, $b)
{
  if ($a['points'] == $b['points']) {
      return 0;
  }
  return ($a['points'] < $b['points']) ? -1 : 1;
}

$result = mysql_query($sql); 
$array = array();
for ($i=1; $r  =  mysql_fetch_array($result); $i++)
{
  if($r['id'] == '3')
    $r['tal'] = $r['tal'] - 5;
  $array[] = $r;
}
usort($array, "cmp");

foreach ( $array as $key => $value )
{
  echo "$key: $value\n";
}
Avatar billede weeelo Nybegynder
16. august 2006 - 16:21 #4
Jeg kan følge det lidt hen ad vejen, og hvis jeg vender return ($a['points'] < $b['points']) ? -1 : 1; til > istedet for <, sorterer jeg omvendt. Hvor kompliceret bliver det, hvis man skal sortere efter 2-3 felter mere?
Avatar billede coderdk Praktikant
16. august 2006 - 16:24 #5
Du kan bare tilpasse cmp funktionen som du vil :)
Avatar billede weeelo Nybegynder
16. august 2006 - 16:33 #6
Super! Lige en sidste ting. $i bliver nu bare det næste tal, efter antallet af rækker.

F.eks. hvis der er 12 rækker bliver det 13 i alle rækkerne, istedet for 1,2,3..10,11,12

Kan du hjælpe med den?
Avatar billede coderdk Praktikant
16. august 2006 - 16:45 #7
Jeg er ikke helt med, kan du forklare yderligere?
Avatar billede weeelo Nybegynder
16. august 2006 - 17:02 #8
Det er ligemeget.. Jeg tilføjede bare $key = $key+1; og brugte $key i mit echo istedet! For at vise hver rækkes placering i forhold til sorteringen.

Mht. tilpasning af cmp-funktionen, hvordan tilpasser jeg med endnu en streng?

Lad os sige at ['name'] skal tilføjes som næste sortering. Hvordan gør jeg det?
Avatar billede weeelo Nybegynder
16. august 2006 - 17:19 #9
Har grejet den ;=) Mange tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester