Sortiern eines Arrays in PHP ?

  1. martin-s

    martin-s Thread StarterMacUser Mitglied

    Mitglied seit:
    12.05.2005
    Beiträge:
    189
    Zustimmungen:
    4
    hallo zusammen,

    ich überarbeite momentan meine homepage und möchte dort dem besucher eine fotogalerie bieten. nun ergibt sich bei mir folgendes problem :
    ich habe mehr als 10 fotos in dieser galerie und habe für jedes foto einen datenbankeintrag angelegt (foto priorität, url, kommentar usw usw). diese priorität bestimmt, in welcher reihenfolge die fotos zu sehen sein sollen. bevor ich die galerie anzeigen lassen will, lese ich alle fotos aus der db in ein array und arbeite das array nachher ab, damit ich die fotos vor dem anzeigen noch sortieren kann (nach priorität).

    nun bin ich bei dem "klassischen" fall angelangt, daß folgende reihenfolge entsteht : 1,10,2,3,4 usw. nun las ich von "natsort (array);". hört sich gut an, funktioniert bei mir aber irgendwie nicht... hier der entsprechende code :

    PHP:
    for ( $x $x <= $number $x++ ) //schleife zum einlesen aller fotos in foto_array
                    
    {    
                        
                    
    $query "SELECT * FROM ".$foto_table." WHERE foto_gallery = 0 AND foto_kat_nr = ".$target." ";
                    
    $result mysql_query($query);
                    
                    
    $foto_array[$y]['foto_dateiname'] = mysql_result($result,$x,'foto_dateiname1');
                    
    $foto_array[$y]['foto_comment'] = mysql_result($result,$x,'foto_comment');
                    
    $foto_array[$y]['foto_tank'] = mysql_result($result,$x,'foto_tank');
                    
    $foto_array[$y]['foto_kategorie'] = mysql_result($result,$x,'foto_kategorie');
        
                    
    $y++;  // offset erhöhen

                    
    }

                
    mysql_close($lh);
        
            
    $x--;
            
            } 
    // ende datenbank auslesen.

            
    natsort $fotoarray );   <<<--- wie bekomm ich das array sortiert ?

    soweit zum quelltext. natürlich wird vorher die db geöffnet usw usw...
    stehe irgendwie leicht aufm schlauch und finde die lösung nicht...
    vielen dank für eure hilfe und auf die gefahr hin, daß die lösung äusserst simpel sein wird frage ich trotzdem mal ;)

    schöne grüsse
    martin
     
    martin-s, 07.04.2006
  2. oneOeight

    oneOeightMacUser Mitglied

    Mitglied seit:
    23.11.2004
    Beiträge:
    48.174
    Zustimmungen:
    3.889
    wie wäre es mit foto_array sortieren lassen, statt fotoarray ;)
     
    oneOeight, 07.04.2006
  3. martin-s

    martin-s Thread StarterMacUser Mitglied

    Mitglied seit:
    12.05.2005
    Beiträge:
    189
    Zustimmungen:
    4
    kleiner formfehler, der aber an der funktion leider nix ändert.
    im originalscript hab ichs schon geändert gehabt, brachte aber nix :(
     
    martin-s, 07.04.2006
  4. Gunter_S

    Gunter_SMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    147
    Zustimmungen:
    3
    schau dir mal die Funktion "usort" an.

    Ganz davon abgesehen ist der Teil in dem du die Daten in ein Array speicherst äußerst unschön:
    - muss die SELECT Abfrage in jedem Schleifendurchgang ausgeführt werden, man sieht leider nicht ob du $target und $foto_table in der Schleife veränderst.
    - du holst dir in jedem Schleifendurchgang ein neues MYSQL-Ergebnis "$result" und wendest trotzdem mysql_result mit der Schleifenvariable an!?

    PS: viel schöner ist für so etwas die Konstruktion:
    Code:
    $res=mysql_query("SELECT feld1, feld2 FROM table ORDER BY feld0815 LIMIT 3,10", $conn);
    while($row=mysql_fetch_array($res, MYSQL_ASSOC)) {
         print_r($row);
    }
    
    Gunter
     
    Gunter_S, 07.04.2006
  5. balufreak

    balufreakMacUser Mitglied

    Mitglied seit:
    12.10.2003
    Beiträge:
    1.556
    Zustimmungen:
    28
    Wie Gunter_S schon gesagt hat.

    Du kanns die Fotos auch schon im SQL nach priorität sortieren

    SELECT *
    FROM deinerTabelle
    ORDER BY priorität_feldname
     
    balufreak, 07.04.2006
  6. martin-s

    martin-s Thread StarterMacUser Mitglied

    Mitglied seit:
    12.05.2005
    Beiträge:
    189
    Zustimmungen:
    4
    die variante mit dem ORDER BY habe ich wieder herausgenommen, da sie zwar sortiert, aber halt nach dem prinzip 1,10,2,3 usw ... und genau das will ich ja nicht haben !

    danke für eure vorschläge !!!
     
    martin-s, 07.04.2006
  7. balufreak

    balufreakMacUser Mitglied

    Mitglied seit:
    12.10.2003
    Beiträge:
    1.556
    Zustimmungen:
    28
    Nimm ORDER BY priority ASC dann passiert dir das nicht. dann wird so sortiert: 1,2,3,...,10,11,12
     
    balufreak, 07.04.2006
  8. martin-s

    martin-s Thread StarterMacUser Mitglied

    Mitglied seit:
    12.05.2005
    Beiträge:
    189
    Zustimmungen:
    4
    sorry balufreak,

    aber genau so hatte ich es geschrieben und genau dann sortiert er nach der nicht gewollten art und weise. er soll nach dem "natural order algorithm" sortieren, nicht nach dem "regular computer string sorting algorithm".

    mein problem besteht darin, daß ich das array scheinbar etwas unglücklich angelegt habe und nun vor dem problem stehe, das array zu sortieren. den befehl NATSORT gibts dafür ja scheinbar, nur weiss ich den im zusammenhang mit dem array nicht anzuwenden. da fehlt mir ein wenig die erfahrung in sachen PHP.

    vielen dank für eure hilfe schonmal !
     
    martin-s, 07.04.2006
  9. Gunter_S

    Gunter_SMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    147
    Zustimmungen:
    3
    was hast du denn für einen Datentyp für die Priority in der DB definiert. Hört sich so an als ob du "Char" oder "VARCHAR" verwendest. Nimm doch mal ein "INT", "SMALLINT" oder ähnliches, dann sortiert MYSQL auch richtig.

    Gunter
     
    Gunter_S, 07.04.2006
  10. Gunter_S

    Gunter_SMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    147
    Zustimmungen:
    3
    Warum das nicht funktionieren kann ist ganz einfach.
    Natsort verlangt ein "normales" Array:
    Code:
    $arr[0]="irgendwas";
    $arr[1]="was anderes";
    
    Bei dir ist aber jeder Eintrag des Arrays wiederum ein Array...
    Woher soll PHP da wissen wie das Array sortiert werden soll?


    wie ich schon sagte: schau dir mal "usort" an http://www.php.net/manual/de/function.usort.php

    dann kommt man durch etwas nachdenken auf so etwas:
    Code:
    function cmp($a, $b) {
       if ($a['priority'] == $b['priority']) {
           return 0;
       }
       return ($a['priority'] < $b['priority']) ? -1 : 1;
    }
    
    usort ($foto_array, "cmp");
    
    Gunter
     
    Gunter_S, 07.04.2006
Die Seite wird geladen...