Avatar billede pblv Nybegynder
01. april 2004 - 14:51 Der er 12 kommentarer og
1 løsning

Sorterer array

Heysa,

Jeg har et array der hedder array.

i det array, der har jeg flere felter. F.eks.

array[i][id]
array[i][navn]
array[i][alder]
array[i][bopæl]

Hvis jeg gerne vil sorterer arrayet efter alder, hvordan gør jeg så?

Mvh
Pierre
Avatar billede limemedia Nybegynder
01. april 2004 - 14:56 #1
Hvor får du dine data fra ? hvis det er fra en database, er det *væsentligt* hurtigere at sortere på alderen her, end via PHP
Avatar billede pblv Nybegynder
01. april 2004 - 15:11 #2
Det er det. Problemet er bare, at en del af dataen fra databasen er der blevet viderearbejdet på. I mit eksempel, der er det foreks. succesprocent af to forskellige tal (Mål og skud), og så skal der så sorteres på procenten. og det kan jeg jo ikke gøre i databasen, uden at oprette en temp tabel? (mysql).

Pierre
Avatar billede limemedia Nybegynder
01. april 2004 - 15:14 #3
dét kan der formodentligt alligevel... prøv at poste din beregning og tabel struktur, så skal jeg lave et forslag til dig
Avatar billede pblv Nybegynder
01. april 2004 - 15:19 #4
Tabellen er en række af aktioner:

tabel | type | spillerid
-----------------------
      |  1  |    2
      |  2  |    2
      |  1  |    1
      |  1  |    2

Så først skal jeg tælle hvor mange af 1'erne og 2'erne hver spiller har lavet, hvorefter jeg skal dividere 1'erne med 1 + 2'erne for hver spiller.

Mvh
Pierre
Avatar billede limemedia Nybegynder
01. april 2004 - 15:37 #5
hvad hedder dine to tabeller ?
Avatar billede pblv Nybegynder
01. april 2004 - 15:44 #6
Der er kun en table. Den hedder "aktioner"
Avatar billede limemedia Nybegynder
01. april 2004 - 15:47 #7
hvor får du så navn / alder / bopæl fra ?
Avatar billede pblv Nybegynder
01. april 2004 - 15:56 #8
Det var bare et eksempel :)
Det jeg har er
array[i][id]
array[i][mål]
array[i][skud]
array[i][succes%]

Synes bare det andet var nemmere at forstå
Avatar billede limemedia Nybegynder
01. april 2004 - 16:53 #9
hmm, dét ville ikke helt som jeg ville. Havde gang i noget ala
SELECT m1.id, COUNT(m1.`type`) AS maal, COUNT(m2.`type`) AS skud
FROM maal AS m1 LEFT JOIN maal AS m2 ON m1.id=m2.id
WHERE m1.`type`=1 && m2.`type`=2
GROUP BY m1.id

anyways, er der en grund til, at du ikke har en struktur ala
spillerid | skud | maal

hvor du så opdaterer med
UPDATE SET skud=skud+1 WHERE spillerid='5'

således du pr. spiller kun har én række fremfor flere rækker (vil være væsentligt hurtigere i databasen og mindre datamængde) - du gemmer jo fx ikke dato info i den tabel du viser

for også at give dig et reelt svar på dit spørgsmål, vil du kunne sortere på success med følgende kode
<?php
    function cmp($a, $b) {
        return ($a["success"]>$b["success"]);
    }

    usort($array, "cmp");
?>

Og et test scenario
<?php
    function cmp($a, $b) {
        return ($a["success"]>$b["success"]);
    }

    $array = array();
    $array[0] = array('spillerid' => 1, 'maal' => 7, 'skud' => 34, 'success' => 50);
    $array[1] = array('spillerid' => 1, 'maal' => 8, 'skud' => 35, 'success' => 60);
    $array[2] = array('spillerid' => 1, 'maal' => 9, 'skud' => 36, 'success' => 40);
    $array[3] = array('spillerid' => 1, 'maal' => 10, 'skud' => 33, 'success' => 70);
    $array[4] = array('spillerid' => 1, 'maal' => 9, 'skud' => 34, 'success' => 30);
    $array[5] = array('spillerid' => 1, 'maal' => 8, 'skud' => 35, 'success' => 80);
    $array[6] = array('spillerid' => 1, 'maal' => 7, 'skud' => 20, 'success' => 20);

    echo "Før sortering : <br>";
    echo "<pre>";
    print_r($array);
    echo "</pre>";

    usort($array, "cmp");

    echo "<br><br>Efter sortering : <br>";
    echo "<pre>";
    print_r($array);
    echo "</pre>";
?>
Avatar billede limemedia Nybegynder
01. april 2004 - 16:55 #10
mere om usort
http://dk.php.net/usort
Avatar billede pblv Nybegynder
02. april 2004 - 10:55 #11
Hej Lars,

For lige at svare på dit første spørgsmål, så er det fordi alt dataen yderligere er delt op i kampe osv. Det er en større historie :)

Men det ser altså ikke helt ud til at virke. Først så opretter jeg deres afleveringsprocent, og så kører jeg denne her:

for ($i=1; $i <= $antalspiller; $i++)
{
    if (($array[$i][fejlafl] + $array[$i][godeafl]) != 0)
        $array[$i][aflpct] = round(($array[$i][godeafl] / ($array[$i][fejlafl] + $array[$i][godeafl]))*100,2);
    else
        $array[$i][aflpct] = 0;
}

function cmp($a, $b) {
    return ($a["aflpct"] > $b["aflpct"]);
}

usort($array, "cmp");

Det giver bl.a. følgende udtræk:


    [47] => Array
        (
            [navn] => Peter Møller
            [klubid] => 2
            [spillerid] => 126
            [position] => 4
            [godeafl] => 12
            [fejlafl] => 10
            [aflpct] => 54.55
        )

    [48] => Array
        (
            [navn] => Sibusiso Zuma
            [klubid] => 2
            [spillerid] => 127
            [position] => 4
            [godeafl] => 45
            [fejlafl] => 35
            [aflpct] => 56.25
        )

Mvh
Pierre
Avatar billede pblv Nybegynder
02. april 2004 - 11:19 #12
Betyder det noget, at der i nogen af posterne også er f.eks.
[sucdrib] => 2, men at det ikke optræder i dem alle?
Avatar billede pblv Nybegynder
02. april 2004 - 12:12 #13
Nå, nu fik jeg sgu løst problemet med:

foreach ($array as $key => $row)
{
  $aflpct[$key] = $row["aflpct"];
}

array_multisort($aflpct, SORT_DESC, $array);

Forstår ikke helt hvorfor man skal give keys osv, men det virker altså. Og farten fejl bestemt ikke noget, selvom der er 300 spillere, men en røvfuld data i hver!

Nå, men du får alligevel point som tak for hjælpen.

Pierre
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