Wie ein Assoziatives Array sortieren?

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

  • Wie ein Assoziatives Array sortieren?

    Hallo,

    ich bin zwar kein Neuling was PHP angeht, aber da ich mir bisher alles selbst angeeignet habe, fehlt mir ab und an der Durchblick

    Ich sitze nun seit ein paar Tagen an einem "Problem" und auch das Suchen im Netz und in Handbüchern hat mir nicht geholfen.

    Vielleicht kann mir jemand helfen oder eine verständliche Anleitung verlinken?

    Folgenden Array habe ich, der durch eine SQL Datenbankabfrage "gefüllt" wird:

    PHP-Code:
    $sortierung[] = array("Name" => $Name"AnzahlG" => $anzahlG"ProzentG" => $prozentG"AnzahlP" => $anzahlP"ProzentP" => $prozentP); 
    Nun möchte ich die Ausgabe nach "ProzentG" sortieren (und später auch nach den anderen Keys - aber zum versthen reicht eine Sortierung).

    Durch die Abfrage der Datenbank kann ich leider keine andere Sortierung als nach "Name" vornehmen, da mehrere Tabellen angesprochen werden und die MySQL Version etwas älter ist.

    Ich hoffe meine Problemlage ist deutlich erklärt und jemand kann mir helfen.

    Mit den besten Grüßen,

    Eure Servetta

  • #2
    Re: Wie ein Assoziatives Array sortieren?

    usort()
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Danke erstmal für die schnelle Antwort !

      hmm.. ja das ist meine Krux... ich lese und verstehe aber bin nicht fähig es umzusetzen...

      Ich weiß, es wird nicht gern gesehen wenn man nach einer direkten Lösung fragt, aber ich kann soetwas am besten an konkreten Beispielen lernen - vielleicht kann jemand helfen?

      Grüße

      /edit/ vielleicht bin ich auf dem Holzweg, aber ich probiere grade eine Lösung mit bubblesort() zu finden:

      PHP-Code:
      function BubbleSort($sortierung,$reverse) {
        for (
      $i 0$i sizeof($sortierung); $i++){
          for (
      $j $i 1$j sizeof($sortierung); $j++){
            if(
      $reverse){
              if (
      $sortierung[$i] < $sortierung[$j]){
                
      $tmp $sortierung[$i];
                
      $sortierung[$i] = $sortierung[$j];
                
      $sortierung[$j] = $tmp;
              }
            }else{
              if (
      $sortierung[$i] > $sortierung[$j]){
                
      $tmp $sortierung[$i];
                
      $sortierung[$i] = $sortierung[$j];
                
      $sortierung[$j] = $tmp;
              }
            }
          }
        }
        return 
      $sortierung;

      Zuletzt geändert von Servetta; 04.07.2006, 16:25.

      Kommentar


      • #4
        Kannst Du nochmal erläutern, wie das Array aufgebaut ist? Obige Darstellung gibt keinen Sinn für mich!?

        Schau Dir aber ruhig mal usort() an, damit kannst Du sehr schön und flexibel sortieren.
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          Original geschrieben von derHund
          Kannst Du nochmal erläutern, wie das Array aufgebaut ist? Obige Darstellung gibt keinen Sinn für mich!?
          Aufgrund der Notation
          PHP-Code:
          $sortierung[] = array(...); 
          gehe ich davon aus, dass das die Belegung eines neuen Elementes im Array $sortierung darstellt.
          $sortierung ist am Ende das zu sortierende Array, und das, was in "array(...)" steht, ein "Element".

          (Wo da jetzt die "Assoziativität" des zu sortierenden Arrays sein soll, sehe ich auch nicht - gibt vermutlich gar keine.)
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Ich befürchte ich bin auf dem vollkommen falschen Weg


            Danke für Eure Hilfe bis hier, wahrscheinlich hätte ich mich sonst noch weiter festgebissen.

            Ich möchte halt nur die obigen Werte irgendwie sortieren.

            Geb ich den array oben so aus bekomme ich die folgende Anzeige:

            ($Name - $anzahlG - $prozentG - $anzahlP - $prozentP)

            (nach Namen)
            Amon - 797 - 80.8 - 984 - 81
            Argas - 529 - 53.7 - 986 - 53.7
            Aspendos - 105 - 10.6 - 354 - 29.7
            Bam - 9 - 0.9 - 19 - 47.4
            Catakia - 653 - 66.2 - 986 - 66.2
            Conman - 12 - 1.2 - 984 - 1.2
            Daewora - 89 - 9 - 623 - 14.3
            Daisho - 393 - 39.9 - 961 - 40.9

            und ich möchte das ganze halt gerne variabel sortieren, zb. so:

            (nach Wert AnzahlG)
            Amon - 797 - 80.8 - 984 - 81
            Catakia - 653 - 66.2 - 986 - 66.2
            Argas - 529 - 53.7 - 986 - 53.7
            Daisho - 393 - 39.9 - 961 - 40.9
            Aspendos - 105 - 10.6 - 354 - 29.7
            Daewora - 89 - 9 - 623 - 14.3
            Conman - 12 - 1.2 - 984 - 1.2
            Bam - 9 - 0.9 - 19 - 47.4

            Aber auch wenn ihr mir wegen meiner beschränkten PHP Fertigkeiten jetzt erstmal nicht helfen konntet, bedanke ich mich )
            Zuletzt geändert von Servetta; 04.07.2006, 17:13.

            Kommentar


            • #7
              Wende mal usort() auf das array an. In der Sortier-Funktion läßt Du Dir mal $a und $b ausgeben (print_r) und siehst dann sicher gleich, was Du wie vergleichen musst. Die Kriterien kannst Du der Funktion (AFAIK) nicht übergeben, kannst sie Dir aber bestimmt aus den $GLOBALS holen. Probier mal, ist wirklich leicht zu durchschauen.
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                nur weil es mir spass gemacht hat und auf diese weise würde ich es nie in einem project machen.
                PHP-Code:
                <?php
                error_reporting
                (E_ALL);
                $gesamt=<<<str
                Amon - 797 - 80.8 - 984 - 81
                Argas - 529 - 53.7 - 986 - 53.7
                Aspendos - 105 - 10.6 - 354 - 29.7
                Bam - 9 - 0.9 - 19 - 47.4
                Catakia - 653 - 66.2 - 986 - 66.2
                Conman - 12 - 1.2 - 984 - 1.2
                Daewora - 89 - 9 - 623 - 14.3
                Daisho - 393 - 39.9 - 961 - 40.9
                str;
                $namen=array("Name","AnzahlG","ProzentG","AnzahlP","ProzentP");

                $inhalt=array();
                $gesamt=explode("\n",$gesamt);
                $i=0;
                foreach(
                $gesamt as $samt){
                  
                  
                $zeile_array=explode("-",$samt);
                  foreach(
                $zeile_array as $k=>$v){
                    
                $inhalt[$i][$namen[$k]]=trim($v);
                    
                  }
                  
                $i++;
                }


                function 
                mysort($a,$b,$feldname,$richtung=1){
                  global 
                $inhalt;
                  if(
                is_numeric($inhalt[0][$feldname])){
                  return (
                $a[$feldname]==$b[$feldname])?0: ($a[$feldname]>$b[$feldname]? : -1)*$richtung;
                  }
                  return 
                strcmp($a[$feldname],$b[$feldname])*$richtung;
                }

                foreach(
                $namen as $n){
                  eval(
                "function sort_by_".$n."(\$a,\$b){global \$inhalt; return mysort(\$a,\$b,'".$n."');}");
                  eval(
                "function sort_by_".$n."_desc(\$a,\$b){global \$inhalt; return mysort(\$a,\$b,'".$n."',-1);}");
                }
                #TEST
                //$inhalt ausgeben
                echo "<pre>";
                echo 
                "vor dem sortieren<br />";
                print_r($inhalt);
                echo 
                "sortieren nach ProzentG<br />";
                usort($inhalt,"sort_by_ProzentG");
                print_r($inhalt);
                echo 
                "sortieren nach Name<br />";
                usort($inhalt,"sort_by_Name");
                print_r($inhalt);
                echo 
                "sortieren nach Name absteigend<br />";
                usort($inhalt,"sort_by_Name_desc");
                print_r($inhalt);
                echo 
                "</pre>";
                ?>
                ist habe quelltext wegen : und ( igeändert, da es als smilies interpretiert wurde.
                Zuletzt geändert von Slava; 05.07.2006, 01:03.
                Slava
                bituniverse.com

                Kommentar


                • #9
                  @ derHund: Vielen Dank ich werde mich mal dranmachen mich da durch zu arbeiten.

                  @Slava: ich konnte der Verlockung nicht wiederstehen Deinen Vorschlag zu testen, leider ohne Erfolg.

                  Jetzt erstmal auf das Halbfinale vorbereiten

                  Kommentar


                  • #10
                    Original geschrieben von Servetta
                    @ derHund: Vielen Dank ich werde mich mal dranmachen mich da durch zu arbeiten.

                    @Slava: ich konnte der Verlockung nicht wiederstehen Deinen Vorschlag zu testen, leider ohne Erfolg.

                    Jetzt erstmal auf das Halbfinale vorbereiten
                    ich würde keine erfolglose code liefern.
                    und error_reportig habe ich auch nicht umsonst auf E_ALL gesetzt.
                    Also brauche ich ein wenig mehr, als "leider ohne Erfolg".

                    Zuletzt geändert von Slava; 05.07.2006, 00:54.
                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      es ist eine anamoli in quelcode aufgetretten! : und ( wurden als smilies interpretiert
                      deshalb habe ich ein lehrzeichen dazwischen in function mysort gemacht
                      Zuletzt geändert von Slava; 05.07.2006, 00:51.
                      Slava
                      bituniverse.com

                      Kommentar


                      • #12
                        jetzt gibt es kein
                        <img src="images/smilies/frown.gif" border="0" alt="">
                        es kommt selten, dass quellcode ein smilies trifft.
                        Jetzt habe ich ein wenig code erweitert, damit du auch absteigend sortieren kannst, (steht jetzt auch in dem TEST)

                        bitte nicht direkt in browser, sondern in browser-quelltext anschauen
                        Angehängte Dateien
                        Zuletzt geändert von Slava; 05.07.2006, 00:07.
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          Hi Slava!

                          Danke für Deine Bemühungen! Ich war gestern einfach zu müde, um noch klare Gedanken zu fassen.

                          Es funktioniert, jetzt muss ich nur noch einen Weg finden um meinen array dort einzubinden.

                          Ich habe ja bereits folgenden array:
                          Code:
                          Array
                          (
                              [0] => Array
                                  (
                                      [Name] => Amon
                                      [AnzahlG] => 21
                                      [ProzentG] => 95.5
                                      [AnzahlP] => 22
                                      [ProzentP] => 95.5
                                  )
                          
                              [1] => Array
                                  (
                                      [Name] => Argas
                                      [AnzahlG] => 14
                                      [ProzentG] => 63.6
                                      [AnzahlP] => 22
                                      [ProzentP] => 63.6
                                  )
                          
                              [2] => Array
                                  (
                                      [Name] => Aspendos
                                      [AnzahlG] => 5
                                      [ProzentG] => 22.7
                                      [AnzahlP] => 13
                                      [ProzentP] => 38.5
                                  )
                          (.......)
                          :edit: Funktioniert Prima ! Ich danke Dir vielmals!

                          Grüße
                          Zuletzt geändert von Servetta; 05.07.2006, 17:15.

                          Kommentar

                          Lädt...
                          X