Dateiinhalt umsortieren

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

  • #16
    Ok ich hab das jetzt mal so ähnlich gemacht wie ich das verstanden habe.

    Ich glaub aber nicht das das so tun wird, ausserdem kommt da eine fehlermeldung ib einer zeile - siehe code:

    PHP Code:
    $sumWerte=array(); # neues, leeres Array initialisieren
    foreach($arr3 as $zeile)
     {
    #zerlege $zeile in die Bestandteile $anzahl, $aufloesung und $farbtiefe
      
    $zt=explode("]-[",trim($zeile));

      
    #wenn es in $sumWerte noch keinen Eintrag mit dem Schlüssel $aufloesung gibt
      #dann lege ihn an, und weise ihm die aktuelle $anzahl zu
      
    if($sumWerte[]!=$zt[1]) {$sumWerte[]=$zt[0];} # <---- Fatal error: Cannot use [] for reading in C:\xampplite\htdocs\screen.php on line 23

      #sonst addiere die aktuelle $anzahl auf den Inhalt dieses Eintrages drauf
      
    else {$sumWerte[]=$zt[0]+$zt[0];}

      
    $user=$user+$zt[0];  # Anzahl aller User ermitteln
     

    ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

    Comment


    • #17
      Die vorgeschlagene Tabellenlösung ist zwar ideal einfach auch von der Sortierung aber so geht es auch:

      PHP Code:
      <?php
      $daten
      =explode("\n",file_get_contents('test.txt')); 
      $out=array();
      foreach (
      $daten as $one)

        
      $dta=explode(']-[',$one);
        if (
      array_key_exists($dta[1],$out))
              
      $out[$dta[1]]=$out[$dta[1]]+intval($dta[0]);
          else
         
      $out[$dta[1]]=intval($dta[0]);
      }
      ksort($out,SORT_NUMERIC);
      unset(
      $daten);
      $total=0;
      echo 
      '<table><tr><td>Aufl&ouml;sung</td><td>Anzahl</td></tr>';
      foreach (
      $out as $k=>$o)
      {
        
      $total =$total$o;
          echo 
      "<tr><td>$k</td><td>$o</td></tr>\n";
      }
      echo 
      "  <tr class='bot'><td>&nbsp;Insgesamt:</td><td class='sp2'>$total</td><td></td></tr></table>\n";  

      ?>
      Die Sortierung ist nicht 100% perfekt aber damit kann man leben:
      Auflösung Anzahl
      800 x 600 158
      1024 x 768 4562
      1152 x 864 668
      1280 x 800 1155
      1280 x 1024 3141
      1280 x 960 164
      1400 x 1050 162
      1440 x 900 1822
      1600 x 1200 212
      1680 x 1050 659
      1920 x 1200 182
      Insgesamt:12885
      Last edited by ; 29-06-2009, 20:35. Reason: Formatierung Ausgabe

      Comment


      • #18
        PHP Code:
        if($sumWerte[]!=$zt[1]) 
        du musst hier schon einen konkreten Index angeben, sonst weiß PHP nicht, wo nach gesucht wird. Du könntest z.B. einen internen Zähler mitlaufen lassen.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Comment


        • #19
          PHP Code:
            #wenn es in $sumWerte noch keinen Eintrag mit dem Schlüssel $aufloesung gibt
            #dann lege ihn an, und weise ihm die aktuelle $anzahl zu
            
          if($sumWerte[]!=$zt[1]) {$sumWerte[]=$zt[0];} # <---- Fatal error: Cannot use [] for reading in C:\xampplite\htdocs\screen.php on line 23 
          $array[] ist die Kurzschreibweise zum Anlegen eines neuen Eintrages - und hier versuchst du aber, diese zum "Lesen" aus dem Array zu benutzen, um einen Vergleich durchzuführen. Das geht so nicht.

          Benutze isset, um zu prüfen, ob es einen Eintrag mit bestimmtem Index im Array schon gibt.

          PHP Code:
          if(isset($array['xyz'])) { // es gibt im array einen Eintrag mit dem Index 'xyz' 
          Und unter eben diesem Index dann auch das neue Array-Element anlegen, wenn noch nicht vorhanden - und nicht unter einem nummerischen, von PHP automatisch vergebenen, wie das $sumWerte[]=$zt[0] macht.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Comment


          • #20
            @piratos

            Hallo und danke für dein post mit der DB-Lösung.

            Ich hab so ne leichte angst von datenbanken. Das ganze ist nicht so praktisch wie meine dateien-versionen. Hier kann ich zB das script irgendwohinkopieren und das legt dann sofort los, wenn keine datei existiert wird sie eben angelegt und fertig.

            Bei einer DB ist das schon schwieriger wenn man mal den server wechselt, phpmyadmin aufrufen und dann hab ich bereits schlaflose nächte.

            Ok, lokal hab ich ein kleines php-script da gib ich meine db + tabellen name ein und den aufbau und dann wird die sofort erstellt. Online konnte/durfte ich das noch nie, da meldet der server das ich nur übers kundenmenü + phpmyadmin usw ran komme...und der name der db wird einem ja auch vorgeschrieben - den muß ich dann erst mal rausfinden!

            Deshalb hab ich alles in dateien laufen, da muß ich mir um nix sorgen machen, früher mußte ich noch chmod 777 mitschreiben aber das braucht man heute nicht mehr...jedenfalls bei meinen letzten 2 providern ist da bereits 777 vergeben...ich hau dann dort noch eine .htaccess mit deny all rein, und alles ist sicher...denke ich.

            zu deinem 2ten script, ja vielen dank, das tut wunderbar, bis auf 3 fehlermeldungen die in diesen 2 zeilen etstehen:

            PHP Code:
              if(array_key_exists($dta[1],$out))
               {
            $out[$dta[1]]=$out[$dta[1]]+intval($dta[0]);} 
            Meldung:
            Notice: Undefined offset: 1 in C:\xampplite\htdocs\screen.php on line 50
            Notice: Undefined offset: 1 in C:\xampplite\htdocs\screen.php on line 51
            Notice: Undefined offset: 1 in C:\xampplite\htdocs\screen.php on line 51

            ...und zwar hab ich rausbekommen wieso: wenn ich in dateien schreibe dann füge ich am ende immer ein \n hinzu, dh, meine letzte zeile in jeder datei ist eine leerzeile
            Hier im script müßte man jetzt prüfen ob die zeile leer ist (= letzte zeile).
            -----------------------------------------------------------------------

            @Knopff
            >du musst hier schon einen konkreten Index angeben, sonst weiß PHP nicht, wo nach gesucht wird.
            Ähmm was ist ein konkreter Index? meinst du ich müßte das so schreiben?
            if($sumWerte[0]!=$zt[1])...

            Ähm an alle: Seit mir nicht böße aber mit arrays hab ich es garnicht drauf...ich denke das fällt euch bestimmt auf.
            -----------------------------------------------------------------------

            @wasaga
            if($sumWerte[]!=$zt[1]) ...
            Hier versuche ich zu lesen?
            Ist das dann bei arrays anders wie bei variablen?...ich dachte ich vergleich ob in $sumWerte[] ein anderer Wert drin ist als in $zt[1].

            Und was meist du mit Kurzform des arrays? Was soll da noch länger dran sein damits eine normalform wäre? ...meist du die indexzahl in den eckklammern?

            ----------
            Wenn die antwort von piratos das ergebnis ist, was du wasaga mit mir vor hattest, dann greifen wir lieber auf sein funktionierendes beispiel zu....ok ist mal wieder copy+paste aber das hätte noch tage gedauert bis ich sowas zusammengebracht hätte!
            ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

            Comment


            • #21
              PHP Code:
              <?php
              $daten
              =explode("\n",file_get_contents('test.txt')); 
              $out=array();
              foreach (
              $daten as $one)

                
              $dta=explode(']-[',$one);
              if (
              count($dta)>=2)
              {
                if (
              array_key_exists($dta[1],$out))
                      
              $out[$dta[1]]=$out[$dta[1]]+intval($dta[0]);
                  else
                 
              $out[$dta[1]]=intval($dta[0]);
              }
              }
              ksort($out,SORT_NUMERIC);
              unset(
              $daten);
              $total=0;
              echo 
              '<table><tr><td>Aufl&ouml;sung</td><td>Anzahl</td></tr>';
              foreach (
              $out as $k=>$o)
              {
                
              $total =$total$o;
                  echo 
              "<tr><td>$k</td><td>$o</td></tr>\n";
              }
              echo 
              "  <tr class='bot'><td>&nbsp;Insgesamt:</td><td class='sp2'>$total</td><td></td></tr></table>\n";  

              ?>

              Comment


              • #22
                Ihr Jungs habt alle zu viel Speicher.

                Ich habe hier nochmal versucht, meinen Vorschlag für die zweite "Aufgabe" (Farbtiefe zusammenfassen) zu aktualisieren und verständlicher in kleinen Logikabschnitten zu präsentieren.

                (Wenn es nicht interessiert, bitte einfach überlesen. )

                Anzuwenden auf die Originaldaten:

                PHP Code:
                <?php

                /*
                 * Daten einlesen, dabei Auflösungen zählen
                 * (ergibt z. B.: $tmp[' 800 x 600'] = 1234)
                 */

                $tmp = array();
                $fh fopen('./data.txt''r');

                while (!
                feof($fh))
                {
                    
                // Zeilenweise lesen, alles ab dem ersten "]" verwerfen
                    // (schneidet Farbtiefe ab)
                    
                $line fgets($fh);
                    
                $line substr($line0strpos($line']'));

                    if (
                array_key_exists($line$tmp))
                    {
                        
                $tmp[$line]++;
                    }
                    else
                    {
                        
                $tmp[$line] = 1;
                    }
                }

                fclose($fh);



                /*
                 * Feld für usort formatieren
                 * (key zu value machen, da usort bestehende keys überschreibt)
                 */

                $resolutions = array();

                foreach (
                $tmp as $key => $value)
                {
                    
                $resolutions[] = array($key$value);
                }



                /*
                 * Einträge nach Anzahl sortieren (komplett ausformulierte Version ;))
                 */

                function usort_callback($a$b)
                {
                    if (
                $a[1] != $b[1])
                    {
                        
                // Erst nach Anzahl sortieren...
                        
                if ($a[1] < $b[1])
                        {
                            return 
                1;
                        }
                        else
                        {
                            return -
                1;
                        }
                    }
                    else if (
                $a[0] != $b[0])
                    {
                        
                // ...dann nach Auflösung sortieren
                        
                if ($a[0] < $b[0])
                        {
                            return 
                1;
                        }
                        else
                        {
                            return -
                1;
                        }
                    }

                    
                // Diese Stelle wird bei den vorliegenden Daten nie erreicht
                    
                return 0;
                }

                usort($resolutions'usort_callback');



                /*
                 * Führende Leerzeichen von Auflösungen (" 800 x 600") entfernen ("800 x 600").
                 * Die Leerzeichen wurden zum korrekten Sortieren benötigt
                 */

                $cnt count($resolutions);

                for (
                $i 0$i $cnt$i++)
                {
                    
                $resolutions[$i][0] = trim($resolutions[$i][0]);
                }



                /*
                 * Sortierte Daten ausgeben
                 */

                foreach ($resolutions as $line)
                {
                    echo 
                sprintf('%05d - %s<br />'$line[1], $line[0]);
                }

                ?>

                Comment


                • #23
                  Hallo, danke

                  >if (count($dta)>=2)
                  Da wird geprüft ob die zeile mindestens 2 nichtleere elemente enthält, hab ich das so richtig interpretiert?


                  Ein problem hab ich aber noch, ich würde die sortierung gerne anhand der meisten bildschirmauflösungen durchführen.

                  Ich habe in dem script noch diese zeile, um nur die meisten 20 auflösungen anzuzeigen...sonst wird das ein zu langes zeug.
                  $out=array_slice($out,0,25);

                  Ich kann aber nicht nach der spalte der user sortieren!
                  Jetzt habe ich folgende zeile gleich hinter dem einlesen der datei geschrieben:

                  $daten=explode("\n",file_get_contents("scr.txt"));
                  rsort($daten,SORT_NUMERIC);
                  $out=array();

                  Damit klappt das...aber ist das auch richtig so oder klappt das nur zufällig?
                  ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                  Comment


                  • #24
                    Originally posted by RamonaS View Post
                    if($sumWerte[]!=$zt[1]) ...
                    Hier versuche ich zu lesen?
                    Ist das dann bei arrays anders wie bei variablen?
                    Du machst an der Stelle einen Vergleich, und für einen Vergleich brauchst du zwei Werte.
                    Also versucht PHP, auf das was auf beiden Seiten des Vergleichsoperator steht, "lesend" zuzugreifen - um an die Werte zu kommen, die es vergleichen soll.

                    ...ich dachte ich vergleich ob in $sumWerte[] ein anderer Wert drin ist als in $zt[1].
                    "In $sumWerte[] " ist aber gar kein Wert "drin", denn -
                    Und was meist du mit Kurzform des arrays?
                    $arrayVariable[] = "wert", nur die eckigen Klammern ohne Angabe eines Index - das ist eine Kurzschreibweise, um einen neuen Wert an ein Array anzuhängen. "PHP, füg' mal bitte diesen Wert in das Array ein, und schau selber nach, welcher der nächste [nummerische] Index ist, und lege das neue Array-Element unter diesem ab".
                    Man kann auch array_push verwenden, um einen neuen Wert in ein Array einzufügen - aber die Kurzschreibweise ist oftmals praktischer.

                    Diese Schreibweise ist aber nur für "schreibende" Zugriffe geeignet (wo also ein Wert zugewiesen werden soll), und nicht für "lesende" (wo der Inhalt einer Variablen errmittelt werden soll). Und darauf, dass genau das nicht geht, hat dich PHP mit der Meldung "Fatal error: Cannot use [] for reading" hingewiesen. Du kannst damit keinen Wert aus einem Array lesen, weil du ja gar nicht angibst, welchen.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Comment


                    • #25
                      Ok also mit
                      $arrayVariable[]
                      kann ich kein wert auslesen weil php nicht weiß welches der indexe ich eigentlich meine....aber zum "befüllen" ist diese schreibweise ok, da fänngt der index dann bei 0 an - wenn ich nicht explizit angebe $arrayVariable[99].

                      Ok das hab ich jetzt mal kappiert....ich hatte, wenn ich schon arrays benutzt habe, die erst befüll und das ging dann problemlos so:
                      PHP Code:
                      foreach(glob("schriften/*.ttf") as $file)
                       {
                      $arr[]=basename($file);} 
                      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                      Comment


                      • #26
                        Originally posted by RamonaS View Post

                        >if (count($dta)>=2)
                        Da wird geprüft ob die zeile mindestens 2 nichtleere elemente enthält, hab ich das so richtig interpretiert?


                        Ein problem hab ich aber noch, ich würde die sortierung gerne anhand der meisten bildschirmauflösungen durchführen.
                        Zu 1 ja, denn es sind 3 Wert vorhanden, Leerzeilen werden somit sicher erkannt.

                        Zur Sortierung änderst du nur die Sortmethde auf

                        arsort($out,SORT_NUMERIC);

                        ----------------------------

                        Ansonsten ist das Thema für mich erledigt, wollte keinen PHP Grundkurs abliefern.
                        Es liegen alle möglichen Lösungsansätze wie auch praktische Scripts vor, das sollte reichen musst dich nur mal für eines entscheiden.

                        Comment


                        • #27
                          Hallo piratos

                          Ok das mit der sortierung klappt jetzt wunderbar, meine idde funktionierte nicht richtig, da waren einige werte - trotz das sie kleiner waren an höherer position aufgelistet.


                          Du hast gestern geschrieben das dieses script nicht ganz richtig arbeitet! Was genau hast du gemeint damit? ich kann jetzt keine fehler feststellen bei der auswertung!

                          Aktuell sieht das script jetzt so aus:
                          PHP Code:
                          $arr3=@file("scr.txt"); $out=array();
                          foreach(
                          $arr3 as $zeile)
                           {
                          $zt=explode(']-[',trim($zeile));
                            if(!empty(
                          $zt[1]))
                             {if(
                          array_key_exists($zt[1],$out))
                               {
                          $out[$zt[1]]=$out[$zt[1]]+intval($zt[0]);}
                              else
                               {
                          $out[$zt[1]]=intval($zt[0]);}
                             }
                           }
                          arsort($out,SORT_NUMERIC);
                          foreach(
                          $out as $v) {if($v>$vmax){$vmax=$v;}}
                          $out=array_slice($out,0,20);

                          foreach(
                          $out as $k=>$v)
                           {
                          $iw=intval($v*400/$vmax); $iw2=intval(400-$iw);
                            echo 
                          "  <tr style='background:$col'>\n";
                            echo 
                          "   <td class='sp1'>".(!empty($k)? $k:'<strong>Javascript deaktiviert</strong>')."</td><td class='sp2'>".intval($v)."</td>\n";
                            echo 
                          drawBar($iw,$iw2,"p");
                            echo 
                          "  </tr>\n"$col=($col==$c1)?$c2:$c1;
                           }
                          echo 
                          " </table>\n\n";
                          unset(
                          $arr3,$out); 
                          Jetzt hätt ich aber wieder 2 fragen

                          1. Ich habe in der ganzen datei 127 einträge die leer sind! Jetzt weiß ich nicht wie die da rein gekommen sind! Die daten werden über ein <img in javascript an php übergeben zum schreiben....wenn der client also JS deaktiviert hat, dann wird php ja erst garnicht ausgelößt und somit kein eintrag vorgenommen.
                          Kann ein client JS aktiviert haben, aber trotzdem keinen der 3 werte (breite, höhe , farbtiefe) übermitteln?

                          2. mit vmax berechne ich den höchsten userwert, das wäre bei 1024 x 768 mit rund 4600 der fall. Diesen wert nehme ich um die breiteste grafik daran auszurichten und alles andere ist dann kleiner dargestellt.
                          Um an den vmax zu kommen habe ich aber diesen zusätzlichen arraydurchlauf
                          foreach($out as $v) {if($v>$vmax){$vmax=$v;}}
                          Ich denke das ist eine zeiverschwendung hier, ich wollte die ermittlung von vmax in der ersten foreach mit reintun, habs in der if und in dem else-zeweig versucht aber das haut nicht hin!
                          Muß ich für vmax jetzt unbedingd das array nochmal durchlaufen?
                          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                          Comment


                          • #28
                            Originally posted by RamonaS View Post
                            Muß ich für vmax jetzt unbedingd das array nochmal durchlaufen?
                            Was du vor allem "musst", ist lernen, das Manual zu lesen - damit du nicht bereits vorhandene Funktionalität wiederholt selber programmierst.

                            PHP: max - Manual
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Comment


                            • #29
                              Hallo,

                              >damit du nicht bereits vorhandene Funktionalität wiederholt selber programmierst.

                              Soll das "entschlüßelt" heißen, das geht schon in der ersten foreach, nur ich hab das wieder nicht kappiert?

                              Dann werd ich mal testen was da geht.
                              ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                              Comment


                              • #30
                                Originally posted by RamonaS View Post
                                Soll das "entschlüßelt" heißen,
                                klick auf den Link zur Funktion, die ich verlinkt habe?

                                Ja, soll es.
                                I don't believe in rebirth. Actually, I never did in my whole lives.

                                Comment

                                Working...
                                X