Sortiern eines Arrays in PHP ?

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von martin-s, 07.04.2006.

  1. martin-s

    martin-s Thread Starter MacUser Mitglied

    Beiträge:
    187
    Zustimmungen:
    4
    MacUser seit:
    12.05.2005
    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
     
  2. oneOeight

    oneOeight MacUser Mitglied

    Beiträge:
    46.831
    Zustimmungen:
    3.633
    MacUser seit:
    23.11.2004
    wie wäre es mit foto_array sortieren lassen, statt fotoarray ;)
     
  3. martin-s

    martin-s Thread Starter MacUser Mitglied

    Beiträge:
    187
    Zustimmungen:
    4
    MacUser seit:
    12.05.2005
    kleiner formfehler, der aber an der funktion leider nix ändert.
    im originalscript hab ichs schon geändert gehabt, brachte aber nix :(
     
  4. Gunter_S

    Gunter_S MacUser Mitglied

    Beiträge:
    150
    Zustimmungen:
    3
    MacUser seit:
    15.03.2004
    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
     
  5. balufreak

    balufreak MacUser Mitglied

    Beiträge:
    1.560
    Zustimmungen:
    28
    MacUser seit:
    12.10.2003
    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
     
  6. martin-s

    martin-s Thread Starter MacUser Mitglied

    Beiträge:
    187
    Zustimmungen:
    4
    MacUser seit:
    12.05.2005
    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 !!!
     
  7. balufreak

    balufreak MacUser Mitglied

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

    martin-s Thread Starter MacUser Mitglied

    Beiträge:
    187
    Zustimmungen:
    4
    MacUser seit:
    12.05.2005
    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 !
     
  9. Gunter_S

    Gunter_S MacUser Mitglied

    Beiträge:
    150
    Zustimmungen:
    3
    MacUser seit:
    15.03.2004
    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
     
  10. Gunter_S

    Gunter_S MacUser Mitglied

    Beiträge:
    150
    Zustimmungen:
    3
    MacUser seit:
    15.03.2004
    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
     

Diese Seite empfehlen