Avatar billede pgm Nybegynder
29. januar 2004 - 00:00 Der er 4 kommentarer og
1 løsning

Sortering af Multi Array

Hey,

jeg skal have sorteret følgende array:
Array
(
    [0] => Array
        (
            [One] => 33
            [Two] => 34
            [OneScore] =>
            [TwoScore] =>
            [4] => 0000-00-00 00:00:00
            [spilleTid] => 0000-00-00 00:00:00
        )
)
Dette skal sorteres efte spilleTid.

udfra http://dk2.php.net/manual/en/function.rsort.php
<?php
function cmp($a, $b) {
  return strcmp($a["spilleTid"], $b["spilleTid"]);
}

usort($faerdig, "cmp");
?>
så bruger jeg denne, men det virker ikke i mine 78 poster i arrayet, ligger der
mens der i i 54 og 55 [spilleTid] => 0000-00-00 00:00:00
    [55] => Array
        (
            [One] => 1
            [Two] => 2
            [OneScore] => 34
            [TwoScore] => 1
            [spilleTid] => 2004-01-07 21:05:00
        )

hvis den sorterede rigtigt ville post 55 jo være i enten starten eller slutningen af arrayet.

post 55 er eneste med andet end 0000-00-00 00:00:00
Avatar billede limemedia Nybegynder
29. januar 2004 - 10:14 #1
Du har ikke mulighed for at sortere på database niveau fremfor på PHP niveau - dét kan sagtens kodes, men vil blive langsomt og uhensigtsmæssigt. Din "spilletid" og "4" ligner et datetime fra fx mysql der er sat i arrayet.
Avatar billede pgm Nybegynder
29. januar 2004 - 23:24 #2
Jo, jeg henter det fra en database... nærmere tre forskellige tabeller.

her er min queryes som jeg henter frem,

$query = "SELECT One, Two,  OneScore, TwoScore, spilleTid FROM traad_w ORDER BY spilleTid DESC";
$query = "SELECT One, Two,  OneScore, TwoScore, spilleTid FROM traad_l ORDER BY spilleTid DESC";
$query = "SELECT ClanID1 AS One, ClanID2 As Two, Result1 As OneScore, Result2 TwoScore, spilleTid FROM pulje_resultat ORDER BY spilleTid DESC";


One  int(4)
Two int(4)
OneScore int(2)
TwoScore int(2)
spilleTid datetime

Jeg skal have de sidste 15 spilleTid's poster ud...
Avatar billede limemedia Nybegynder
30. januar 2004 - 03:28 #3
når du allerede på databasen sorterer på spilleTid, bør det jo allerede virke ?
hvilken af de tre queries giver data til dit array ?
Avatar billede pgm Nybegynder
01. februar 2004 - 11:32 #4
de giver alle sammen data til mit array, da jeg putter dem ind i et samlet array.

og her ønsker jeg at sortere de data efter spilleTid så jeg kan få de sidste 15 poster ud.
Avatar billede limemedia Nybegynder
01. februar 2004 - 13:51 #5
Jeg har forsøgt at lave en funktion til formålet, omend jeg ikke "i god tro" kan anbefale dig at anvende det.

For at sortere på spilleTid, er vi nødt til at konvertere dette til en sorterbar værdi. Jeg har i eksemplet valgt at konvertere det til sekunder. Détte bør du gøre på database niveau, således at PHP ikke skal foretage denne beregning. Såfremt tin "spilleTid" er af datetime type, kan du anvende følgende funktion, der vil konvertere spilleTid til antal sekunder siden 1970.

UNIX_TIMESTAMP(spilleTid)
Ref : http://www.mysql.com/doc/en/Date_and_time_functions.html

Desuden bør du, hvis du kun skal bruge 15 spilleTids poster, tilføje en LIMIT 0,15 på dine query's, således der ikke hentes flere felter end højest nødvendigt.

Mit eksempel herunder :
<?php
    function cmp($a, $b) {
        if ($a == $b) return 0;

        $a = $a['spilleTid'];
        $b = $b['spilleTid'];
       
        $aSec = date('U', mktime(substr($a,11,2), substr($a,14,2), substr($a,17,2), substr($a,5,2), substr($a,8,2), substr($a,0,4)));
        $bSec = date('U', mktime(substr($b,11,2), substr($b,14,2), substr($b,17,2), substr($b,5,2), substr($b,8,2), substr($b,0,4)));

        return ($aSec < $bSec) ? -1 : 1;
    }

    $test = array();
    $test[] = array('One'=>1, 'Two'=>2, 'OneScore'=>34, 'TwoScore'=>16, 'spilleTid'=>'2004-01-07 21:05:00');
    $test[] = array('One'=>2, 'Two'=>3, 'OneScore'=>33, 'TwoScore'=>17, 'spilleTid'=>'2004-01-06 21:05:00');
    $test[] = array('One'=>1, 'Two'=>2, 'OneScore'=>32, 'TwoScore'=>18, 'spilleTid'=>'2004-01-08 21:05:00');
    $test[] = array('One'=>2, 'Two'=>3, 'OneScore'=>31, 'TwoScore'=>19, 'spilleTid'=>'2004-01-07 21:45:00');
    $test[] = array('One'=>1, 'Two'=>2, 'OneScore'=>30, 'TwoScore'=>20, 'spilleTid'=>'2004-01-06 17:20:00');
   
    echo 'Usorteret array<br><pre>';
    print_r($test);
    echo '</pre>';

    uasort($test, 'cmp');
    echo 'Sorteret array<br><pre>';
    print_r($test);
    echo '</pre>';
?>

uasort dok : http://dk.php.net/uasort
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