Avatar billede truthorn Nybegynder
12. januar 2003 - 16:36 Der er 3 kommentarer og
1 løsning

array sortering

Jeg har en MySQL-database, hvor jeg får følgende op fra:
"id (fortløbende), fornavn, efternavn, year (fødselsår)".

Jeg vil gøre det, så jeg kun skal lave ET SQL-kald, dvs. lave et array som jeg kan sortere i og genbruge senere hen.

(I sidst ende skal jeg blot lave en slags adressebogsliste, hvor man skal kunne sortere - og jeg ønsker IKKE at lægge logikken i SQL-statement'en, fordi jeg SKAL lære det her med arrays ordentligt :-/)

SQL-statement'en ser p.t. således ud...

$res = mysql_query("SELECT * FROM adressebog");
while($obj 0 mysql_fetch_array)$res))
{
  // array-høllajsa
}

// herefter en eller anden array-sortering.....der "holder" Deres pladser, så Mads i adressebogen stadigvæk er 20 år gammel, og IKKE 30 (fordi dette kom fra Jens.....for ligesom at skære det i pap :)

Håber, at der er nogle, der kan hjælpe mig :)
Avatar billede jakoba Nybegynder
12. januar 2003 - 16:55 #1
det nemmeste her er nok at bruge en  usort()  det vil sige sortering ved hjælp af en bruger(User) defineret SORTeringsfunktion.
http://dk.php.net/manual/en/function.usort.php

du starter med at lave en lille funktion der får 2 parametre. hver parameter svarer til en af de henter ud af databasen. så hvis du har felterne:
  navn      streng
  alder      tal
og ønsker at sortere så de yngste kommer først kan du lave en funktion som:

function sort_pr_alder( $a, $b ) {
    if ( $a['alder'] < $b['alder'] ) return -1;  // $a er mindst
    if ( $a['alder'] > $b['alder'] ) return 1;  // $a er størst
    // hvis alderen er den samme bruger vi navnet som tiebraker
    if ( $a['navn'] < $b['navn'] ) return -1;
    if ( $a['navn'] > $b['navn'] ) return 1;
    return 0;  // de to er ens
}

// den kan vi bruge i vores sortering men først kal vi lige have hentet det array der skal sorteres ud af databasen:

$res = mysql_query("SELECT * FROM adressebog");
$arr = array();  // det bliver et array hvor hver celle
                  // indeholder een række fra tabellen
while($obj = mysql_fetch_array($res)) {  // array-høllajsa
  $arr[] = $obj;  // bygger arrayet
}

// og nu kan vi bruge usort til at sortere:
usort( $arr, "sort_pr_alder" ); // sorterer med funktionen sort_pr_alder

mvh JakobA
Avatar billede truthorn Nybegynder
13. januar 2003 - 11:56 #2
Så er jeg tilbage - tak for din hjælp.....(jeg arbejder med dit indlæg)....men har visse problemer - måske forholder det sig til grundlæggende array-ting.....

Her har jeg en bid kode (fra noget rollespils-halløj).....

$res = mysql_query("SELECT * FROM race");
$array = array();
while($obj = mysql_fetch_array($res))
{
    $array[] =    array(
                "raceid"=>"$obj[raceid]",
                "racenavn"=>"$obj[racenavn]",
                "racebeskrivelse"=>"$obj[racebeskrivelse]"
                );
}




sort($array);
reset($array);


$p=0;
while(list($key) = each ($array))
{
    print $array[$p][raceid];
    print $array[$p][racenavn];
    echo "<br>";

    $p++;
}

Dette er vel sådan set et multidimensionelt array - er det ikke?
Hvis Jeg gerne vil sortere i det array for jeg eksempelvis sprøjter det ud - hvordan gør jeg det så - jeg er ikke sikker på, at jeg helt forstod din compare-funktion :-/
Avatar billede jakoba Nybegynder
13. januar 2003 - 12:50 #3
jo det er et multi-dimensionalt array.
det vi mangeler at få klart er vist at 'et array' også er en variabel, selvom også det er en stor en med sturktur og undervariable.
det du skriver:
  $array[] =    array(
                "raceid"=>"$obj[raceid]",
                "racenavn"=>"$obj[racenavn]",
                "racebeskrivelse"=>"$obj[racebeskrivelse]"
                );
har 100% samme eftekt som at skrive:
  $array[] =  $obj;
          // variablen $obj er et array med hele den udtrukne række i.
der kan være grunde til at gøre det på den måde du bruger (fx at der er masser af andre felter i rækken der ikke skal bruges til noget) men umiddelbart er det blot spild af servertid at oprette endnu et array med de samme feltnavne som du allerede har.

det du gør er altså at oprette et array hvor hver celle i det array igen er et array. (jeg ville ønske du ville kalde det noget andet end '$array' det ord er alleride ibrug til andre ting og det kan nemt give forvirring, selvom også php nok godt kan hitte ud af det her).

Det compare-funktionen gør er at definere reglen for hvornår et af de arrays der er celler er 'større' end et andet. I eksemplet ovenfor er reglen "feltet alder sammenlignes først, og hvis alder er ens sammenlignes der på navnet". det giver det præcis samme som du ville have fået med sql-kommandoen:
"
    SELECT *
    FROM adressebog
    ORDER BY alder ASC, navn ASC
"

funktionens parametre $a og $b er hver et af celle-arrayene fra det store array.

mvh JakobA
Avatar billede truthorn Nybegynder
13. januar 2003 - 16:34 #4
Mange tak for hjælpen - nu giver arrays MEGET mere mening - jeg er sat RIGTIG godt på sporet nu!

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