Objekte sortieren nach bestimmten Kriterien

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekte sortieren nach bestimmten Kriterien

    Hallo!
    Ich brauch mal Eure Hilfe...
    Bin totale Anfängerin und versteh noch nicht so viel von PHP...

    Folgendes Problem:
    Ich habe Ergebnisse einer Suche, die ich sortieren möchte.
    Die Ergebnismenge ist eine Sammlung von Objekten (Literaturtitel)
    Jedes Objekt besitzt viele Eigenschaften, nach denen ich sortieren möchte.
    Die Sortierung muss auf PHP-Ebene stattfinden, nicht auf SQL-Ebene.

    Ich wollte das eigentlich mit usort() lösen, doch bei leeren Einträgen werden die
    Objekte dazwischen sortiert und nicht ans Ende. Schätze, mit der Vergleichsfunktion stimmt etwas nicht...

    Ein Beispiel:
    Meine Titel besitzen u.a. ein Erscheinungsjahr, aber eben nicht alle...

    Der Code für die Vergleichsfunktion:

    PHP-Code:
    function vergleicheErscheinungsjahrAsc($titel1$titel2)
    {    
        if (
    $titel1->erscheinungsjahr == $titel2->erscheinungsjahr
        {
            return 
    0;
        }
        else if (
    $titel1->erscheinungsjahr == 0
        {
            return 
    1;
          } 
        else if (
    $titel1->erscheinungsjahr $titel2->erscheinungsjahr
        {
            return -
    1;
        } 
        else
        {
            return 
    1;
        }

    Der Aufruf:
    PHP-Code:
    $sortierung "vergleicheErscheinungsjahrAsc"
    usort($titel$sortierung); 


    ... wobei ich den Code auch nicht verstehe und ihn aus dem Internet umgebastelt habe... ;-)
    doch ohne Leereinträge funktioniert's schon.
    Alles seltsam.

    Habt Ihr eine Idee?
    Liebe Grüße
    Danni
    Zuletzt geändert von Danni78h; 12.06.2006, 16:19.

  • #2
    versuch bitte so:
    sorge aber dafür, dass erscheinungsjahr immer initialisiert ist, also wenigstens 0 muss drin stehen.
    PHP-Code:
    function vergleicheErscheinungsjahrAsc($titel1$titel2)
    {    
        if (
    $titel1->erscheinungsjahr == $titel2->erscheinungsjahr
        {
            return 
    0;
        }
         if (
    $titel1->erscheinungsjahr $titel2->erscheinungsjahr
        {
            return -
    1;
        } 
        
            return 
    1;
        

    Slava
    bituniverse.com

    Kommentar


    • #3
      Hallo Slava!

      Dank Dir für die schnelle Antwort . So hatte ich's davor schon mal, aber dann werden ja die 0er Einträge an den Anfang gestellt und das möchte ich nicht. Wie bekomme ich die leeren Einträge nach hinten?

      Ganz LG
      Danni

      Kommentar


      • #4
        so?
        PHP-Code:
        function vergleicheErscheinungsjahrAsc($titel1$titel2)
        {    
            if (
        $titel1->erscheinungsjahr == $titel2->erscheinungsjahr
            {
                return 
        0;
            }
             if (
        $titel1->erscheinungsjahr $titel2->erscheinungsjahr
            {
                return -
        1;
            } 
            if(
        $titel1->erscheinungsjahr=="" )
                return 
        1;
              return 
        1;
            

        Slava
        bituniverse.com

        Kommentar


        • #5
          Glaub nicht... Da ist doch jetzt kein Unterschied zu meinem drin, oder *verwirrtbin*?
          Leere Einträge haben bei mir den Wert 0, also nicht "". Und mit meinem funktioniert's halt nicht wirklich...

          Kommentar


          • #6
            dann schtimmt mit deinem Array was nicht.
            Damit du funktionalität von usort nachvolziehen kannst
            zeige ich dir ein beispiel.
            Diese programmiertechnik heist "ereignisorientiert" und wird oft bei java angewendet , ist auch in PHP wie z.b.s bei xml-parser oder usort zu sehen.

            ich mache einfach ein beispiel mit bubblesort.

            PHP-Code:
            //bublesort
            function bubble_sort($array,$comparefunction){
              
            $zcount=count($array);
              for(
            $i=1;$i<$zcount;$i++){
                 for (
            $a=$zcount-1;$a>=$i;$a--) {
            //hier lasse ich dich entscheiden welche vergleichmechanismus du einbaust
            //vorraussetzung deine function muss 2 parameter zum vergleichen haben
            //und ein zahl liefern
                   
            if($comparefunction($array[$a-1],$array[$a])>0){
                     
            $tempzal=$array[$a-1];
                     
            $array[$a-1]=$array[$a];
                     
            $array[$a]=$tempzal;
                    }     
                 }     
                }
                return 
            $array;
            }

            //jetzt mache ich so eine function die vergleichen ermöglicht
            function aufsteigend($a,$b){
             if(
            $a<$b)return -1;
             if(
            $a==$b)return 0;
             return 
            1;
            }

            //jetzt testen wir
            $ar=array(2,6,3,1);
            print_r(bubble_sort($ar,"aufsteigend"));

            //oder absteigend
            function absteigend($a,$b){
             if(
            $a>$b)return -1;
             if(
            $a==$b)return 0;
             return 
            1;
            }
            print_r(bubble_sort($ar,"absteigend")); 
            Ich hoffe, dass diese EVENT-orientierte Technik für dich ein wenig besser verstanden wurde
            Slava
            bituniverse.com

            Kommentar


            • #7
              Danke für Deine Mühe, versteh's jetzt glaub ich schon...

              Allerdings frag ich mich nun wieder, was dann nicht geht ... Mir scheint, mein ganzes Programm ist in sich nicht stimmig. Kann es leider nicht posten, weiss ja nicht, an welcher Stelle das Problem auftritt... Und ich habe VIELE Dateien. Gut, dann kann ich die Sortierfunktion an dieser Stelle für die Fehlfunktion schon mal ausschliessen... ist ja auch was.
              Schönen Abend!!
              LG
              Danni

              Kommentar


              • #8
                nein!
                das liegt schon in dieser function
                mann muss aber der fall mit 0 als erste abfragen, sonnst kommt es in meisten fällen zu dieser abfrage gar nicht
                PHP-Code:
                function vergleicheErscheinungsjahrAsc($titel1$titel2)
                {    
                    if(
                $titel1->erscheinungsjahr=="" || $titel1->erscheinungsjahr==)
                        return 
                1;

                  if (
                $titel1->erscheinungsjahr == $titel2->erscheinungsjahr
                    {
                        return 
                0;
                    }
                     if (
                $titel1->erscheinungsjahr $titel2->erscheinungsjahr
                    {
                        return -
                1;
                    } 
                          return 
                1;
                    

                Slava
                bituniverse.com

                Kommentar


                • #9
                  Folgende Funktion habe ich extra dafür geschrieben

                  Siehe hier:

                  Tutorial

                  Aufruf und Benutzung steht alles dort beschrieben!

                  Der Vorteil an dieser Funktion ist, dass man beim Aufruf der Sortierfunktion mehrere Felder angeben kann, nach denen dann Hirarchisch sortiert wird. Das Ganze übergibt man dann in einem Array! Aber siehe selbst!

                  Aufruf in deinem Falle wäre z. B.:
                  PHP-Code:
                  $sortDefinition = array("FeldName1" => "DESC""FeldName2" => "ASC""FeldName3" => "DESC");
                  $deinArray sortObj($deinArray$sortDefinition); 
                  Voila! Dein Array ist nach deinen Kriterien sortiert! Wie du die Funktion bei dir genau benutzt sieht du im oberen Link!

                  lg

                  klein Artur

                  Kommentar

                  Lädt...
                  X