Daniel: Array sortierung

Hi,
ich glaub ich machs mir grad extra kompliziert. ich habe eine DB. in der gewisse dinge erfasst werden, z.B. welcher User welche programme nutzt. nun hole ich mir in der einen tabelle erstmal welche programme benutzt werden und schaue dann wieviele es benutzten (mit mysql_num_rows). funktioniert auch alles wunderbar. hab die ausgabe momentan direkt. nun bin ich dabei es umzustellen und das ganze in ein array zu speichern was so aufgebaut ist:

Array
(
    [0] => Array
        (
            [3] => MS Word

  
//          ^Anzahl-User => Programm  

)

[1] => Array
        (
            [1] => MS Excel
        )

[2] => Array
        (
            [2] => MS Access
        )

[3] => Array
        (
            [1] => MySQL
        )

)

nun würd ich das array gerne sortieren und dann eine ausgabe die in etwa so aussehen soll:

MS Word   | 3
MS Access | 2
.
.
.
evt. auch ein bild mit dynamischem width="20*$anzahl". aber momenten
hänge ich an der sortierung. ich kriegs nicht hin, egal ob ich asort,
sort oder sonst was nehme, es klappt nicht wie ich will. weis mir da
vll jmd rat? ich bin kurz vorm verzweifeln.

  1. Hallo Daniel,

    nun würd ich das array gerne sortieren und dann eine ausgabe die in etwa so aussehen soll:

    MS Word   | 3
    MS Access | 2
    .
    .

    Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.

    Grüsse
    Frankie

    1. Hi Frankie,

      Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.

      also das array wird so aufgebaut:

        
      $sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";  
      $benutze_prog_erg = mysql_query($sql);  
      $benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten  
      for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++)  
      {  
        $sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)  
        $erg = mysql_query($sql);  
        if(mysql_num_rows($erg)>=1)  
        {  
          $daten = mysql_fetch_array($erg);  
          $sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?  
          $erg = mysql_query($sql);  
          $anzahl_user = mysql_num_rows($erg);  
          if ($anzahl_user>0)  
          {  
            $prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array  
            echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";  
          }  
        }  
      }  
      
      

      wie müsst ich den code verändern damit das gleich sortiert drinsteht?
      ich hab grad nen hänger. und ich sagte ja das ich denke das ich mir
      das leben unnötige schwer mache und der code unnötig kompliziert ist.

      MfG

      1. Hallo Daniel,

        Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.

        also das array wird so aufgebaut:

        $sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";
        $benutze_prog_erg = mysql_query($sql);
        $benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten
        for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++)
        {
          $sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)
          $erg = mysql_query($sql);
          if(mysql_num_rows($erg)>=1)
          {
            $daten = mysql_fetch_array($erg);
            $sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?
            $erg = mysql_query($sql);
            $anzahl_user = mysql_num_rows($erg);
            if ($anzahl_user>0)
            {
              $prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array
              echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";
            }
          }
        }

        
        >   
        > wie müsst ich den code verändern damit das gleich sortiert drinsteht?  
          
        ~~~php
          
          
        $sql = "SELECT id_programm, count(*) as anzahl_user FROM $tbl_lookup_amp GROUP BY id_programm";  
        $benutze_prog_erg = mysql_query($sql);  
          
        $out = "";  
        while ($row = mysql_fetch_array($benutze_prog_erg, MYSQL_ASSOC)) {  
          $sql = "SELECT name_program FROM $tbl_programme WHERE id_programm='".$row['id_programm']."' ORDER BY name_program";  
          $erg = mysql_query($sql);  
          if ($daten = mysql_fetch_array($erg)) {  
            $out[$daten['name_program']] = $row['anzahl_user'];  
          }  
        }  
          
        echo "<pre>"; print_r($out); echo "</pre>";  
        
        

        Die Ausgabe sollte nach name_program sortiert sein.

        Das ist ungetestet, sollte aber prinzipiell funktionieren. Bezeichnungen und so mußt halt anpassen.

        Probier's einfach mal aus und sag bescheid ob's funktioniert.

        Grüsse
        Frankie

        1. Hi,
          hab den code angepasst. allerdings schreibt er mir

          Array
          (
              [MS Word] => 3
              [MS Excel] => 1
              [MS Access] => 2
              [MySQL] => 1
          )

          also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,
          allerdings wirds dann "falschrum" sortiert, also aufsteigend anstatt
          absteigend. sprich ich bekomm

          Array
          (
              [MySQL] => 1
              [MS Excel] => 1
              [MS Access] => 2
              [MS Word] => 3
          )

          ich will aber, wie kann ich das ändern? ich steh heut voll auf meiner langen leitung.

          Array
          (
              [MS Word] => 3
              [MS Access] => 2
              [MySQL] => 1
              [MS Excel] => 1
          )

          MfG

          1. Hallo Daniel,

            hab den code angepasst. allerdings schreibt er mir

            Freut mich, daß er funktioniert ,-)

            also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,
            allerdings wirds dann "falschrum" sortiert, also aufsteigend anstatt
            absteigend. sprich ich bekomm

            Array
            (
                [MySQL] => 1
                [MS Excel] => 1
                [MS Access] => 2
                [MS Word] => 3
            )

            ich will aber, wie kann ich das ändern? ich steh heut voll auf meiner langen leitung.

            wie wär's mit rsort() ?

            Grüsse
            Frankie

            1. Hi,

              wie wär's mit rsort() ?

              danke, aber das macht ja das Assoziative weck, dadurch bin ich aber auf
              arsort() gestoßen, genau das was ich brauche. jetzt muss ich nurnoch für
              die von mir gewünschte ausgabe sorgen.

              Vielen dank für deine hilfe

              MfG

              1. Hallo!

                wie wär's mit rsort() ?

                danke, aber das macht ja das Assoziative weck, dadurch bin ich aber auf
                arsort() gestoßen, genau das was ich brauche. jetzt muss ich nurnoch für
                die von mir gewünschte ausgabe sorgen.

                Wieso nicht alles direkt in einer SQL-Abfrage machen?

                  
                $sql = "SELECT  
                            pname.name_programm as name,  
                            count(*) as anzahl_user  
                        FROM $tbl_lookup_amp as pid  
                        LEFT JOIN $tbl_programme as pname  
                        ON pid.id_programm = pname.id_programm  
                        GROUP BY name  
                        ORDER BY name";  
                  
                $res = mysql_query($sql) or die('Fehler: ' . mysql_error());  
                $programme = array();  
                while ($row = mysql_fetch_assoc($res)) {  
                  $programme[$row['name']] = $row['anzahl_user'];  
                }  
                echo "<pre>"; print_r($programme); echo "</pre>";  
                
                

                siehe http://dev.mysql.com/doc/mysql/de/join.html

                Grüße
                Andreas

                --
                SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
                1. Hi,

                  Wieso nicht alles direkt in einer SQL-Abfrage machen?
                  siehe http://dev.mysql.com/doc/mysql/de/join.html

                  weil das nicht geht. mein chef beschwert sich schon wenn ich in einem if
                  ein if hab. wenn ich dann komplexere sql abfragen mache, dann gibts wieder stress und jetzt kurz vor dem WE kann ich gut darauf verzichten.

                  MfG

                  1. Hallo!

                    Wieso nicht alles direkt in einer SQL-Abfrage machen?
                    siehe http://dev.mysql.com/doc/mysql/de/join.html

                    weil das nicht geht.

                    Geht das technisch nicht, also werden nicht die richtigen Daten abgefragt?

                    mein chef beschwert sich schon wenn ich in einem if
                    ein if hab.

                    Naja, das zeugt manchmal von ineffizientem Code, der von Dir ist ein hervorragendes Beispiel (es sei denn es geht nicht anders, was ich so nicht beurteilen kann), sorry ;-)
                    Das zu verallgemeinern ist allerdings Schwachsinn. Viel schlimmer als ein if im if ist ein if in einer Schleife. Noch viel schlimmer ist eine SQL-Abfrage in der Schleife, und noch schlimmer sind mehrere Abfragen in einer Schleife, oder Abfragen die auch noch sorieren müssen...

                    wenn ich dann komplexere sql abfragen mache, dann gibts wieder stress und jetzt kurz vor dem WE kann ich gut darauf verzichten.

                    *g*
                    Das ist nicht komplex, und es ist nur eine einzige Abfrage die alles so abfragt wie Du es vermutlich brauchst, fertig sortiert...

                    Ich kommentiere mal Deinen Code:

                    $sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";  
                    $benutze_prog_erg = mysql_query($sql);  
                    $benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten
                    

                    Du willst die maximale ID für die Abfragen, um dann für jede ID von 1-MAX eine (sogar zwei) SQL-Abfragen an die DB zu schicken, die die benötigten Daten abfragt. Allerdings fragst Du nicht nur einen Datensatz ab, sondern es werden ALLE Daten in $tbl_lookup_amp (*) gruppiert nach id_programm von der Datenbank abgefragt. Zusätzlich werden alle Datensätze sortiert. Diese werden erstmal alle auf den CLient übertragen, Du benutzt dann aber nur einen einzigen der Datensätze. Hast Du 100 Produkt-IDs, werden auch 100 Datensätz übertragen. Die Daten bleiben bis zum Ende des Scriptes lokal im Speicher verfügbar, werden aber bis auf den einen Datensatz nicht abgefragt. Die JOIN-Variante ist alles in allem vermutlich kaum aufwändiger als diese eine Abfrage von Dir.

                    for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++) {

                    Falls auch mal ein Produkt aus der DB gelöscht wird, oder mal ein Fehler beim Anlegen passiert ist, fehlen Dir IDs, was Dich zu den Workarounds unten zwingt.
                    Wenn Du 100 IDs hast, werden hier jetzt noch 200 Anfragen an die DB geschickt, wie gesagt, wenn Du JOIN verwendest ist und bleibt es eine einzige.

                      
                      $sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)  
                      $erg = mysql_query($sql);  
                      if(mysql_num_rows($erg)>=1)  
                      {  
                        $daten = mysql_fetch_array($erg);  
                        $sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?  
                        $erg = mysql_query($sql);  
                        $anzahl_user = mysql_num_rows($erg);  
                        if ($anzahl_user>0)  
                        {  
                          $prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array  
                          echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";  
                        }  
                      }  
                    }
                    

                    Bis auf den Programm-Namen fragst Du hier in der Schleife für jede einzelne  ID Informationen ab, die Du bereits aus der allerersten Abfrage hast. Den Namen kannst Du Dir dann sehr einfach per JOIN besorgen. Dazu kommt dass Du mit Deiner Variante die Daten am Ende nocheinmal in PHP sortieren musst.

                    Wenn Dein Chef sich aufregt dass Du if in if verwendest, kann ich mir nicht vorstellen dass er mit solchen Schleifen zufrieden ist, außerdem verwendest Du immer * wordurch wahrscheinlich viel zu viele Daten übertragen und in den Arbeitsspeicher geladen werden. Du fragst z.B. in jedem Schleifendurchlauf ALLE Daten, die die Datenbank in $tbl_lookup_amp zu einem Produkt stehen hat ab, nur um die Datensätze zu zählen, und das wohl gemerkt in einer Schleife!

                    Aber gut, musst Du natürlich selbst wissen wie Du das machst ;-)

                    Grüße
                    Andreas

                    --
                    SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
                    1. Hi,

                      Aber gut, musst Du natürlich selbst wissen wie Du das machst ;-)

                      ich mach es so das es meinem chef recht ist. wenn ich privat
                      programmiere schau ich auch das ich transfer etc. niedrig halte. da das
                      ganze aber eh nicht übers internet läuft, nichtmal über intranet sondern
                      nur lokal ist der zusätzliche zeitaufwand ja recht gering und der viele
                      datentransfer unwichtig. Und von wegen alle daten in den ganzen tabellen
                      sind nur 2-3 spalten. wobei in nur einer irgendwas steht in den anderen
                      bzw der anderen nur die ID.

                      MfG

          2. Hallo Daniel

            hab den code angepasst. allerdings schreibt er mir

            Array
            (
                [MS Word] => 3
                [MS Excel] => 1
                [MS Access] => 2
                [MySQL] => 1
            )

            also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,

            Die ORDER BY-Klausel ist ganz hilfreich. Füge diese Franks SQL-Statement an, und Du erhältst, was Du haben willst. Natürlich mit DESC.

            Freundliche Grüße

            Vinzenz