Wie ein Assoziatives Array sortieren?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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.

    Comment


    • #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;

      Last edited by Servetta; 04-07-2006, 15:25.

      Comment


      • #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

        Comment


        • #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.

          Comment


          • #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 )
            Last edited by Servetta; 04-07-2006, 16:13.

            Comment


            • #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

              Comment


              • #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.
                Last edited by Slava; 05-07-2006, 00:03.
                Slava
                bituniverse.com

                Comment


                • #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

                  Comment


                  • #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".

                    Last edited by Slava; 04-07-2006, 23:54.
                    Slava
                    bituniverse.com

                    Comment


                    • #11
                      es ist eine anamoli in quelcode aufgetretten! : und ( wurden als smilies interpretiert
                      deshalb habe ich ein lehrzeichen dazwischen in function mysort gemacht
                      Last edited by Slava; 04-07-2006, 23:51.
                      Slava
                      bituniverse.com

                      Comment


                      • #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
                        Attached Files
                        Last edited by Slava; 04-07-2006, 23:07.
                        Slava
                        bituniverse.com

                        Comment


                        • #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
                          Last edited by Servetta; 05-07-2006, 16:15.

                          Comment

                          Working...
                          X