Array sortieren

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

  • #31
    so, ich habs' jetzt auch mal getestet:
    größe laufzeit variante 1 laufzeit variante2
    47kb 0.0462689399719 0.00802803039551
    6mb 0.0203940868378 0.0907700061798
    190mb 0.0999081134796 6.65482997894
    820mb 0.104756832123 27.180262804
    war eigentlich besser formatiert, aber das forum verschluckt irgendwie die doppelten spaces

    Kommentar


    • #32
      Danke für den Hinweis, das hatte ich nicht verstanden.

      Kommentar


      • #33
        Original geschrieben von 3DMax
        so, ich habs' jetzt auch mal getestet:


        war eigentlich besser formatiert, aber das forum verschluckt irgendwie die doppelten spaces
        Das sieht ja so aus, dass Variante 2 bei anwachsenden Inhalt immer langsammer wird.

        Kommentar


        • #34
          in der tat ist die erste variante bei signifikanten datenmengen deutlich schneller!

          Kommentar


          • #35
            Original geschrieben von lamoe
            Das sieht ja so aus, dass Variante 2 bei anwachsenden Inhalt immer langsammer wird.
            aber wirklich erst bei extremen datenmengen, die dann sowieso besser in einer datenbank aufgehoben wären.

            nachtrag:
            meine variante sollte eine in etwa konstante laufzeit haben (unabhängig von der dateigröße) - hatte gestern auch 0,06 bei einer 820 mb-datei.

            das einzige was bremst, sind dann bei großen zeilenlängen die fseek operationen. (dadurch auch die schwankungen in den tests)
            Zuletzt geändert von 3DMax; 26.12.2006, 15:08.

            Kommentar


            • #36
              Ich hab mal noch eine Frage, die Suchwörter werden mit
              PHP-Code:
              fputs($fp,$search."\r\n",256); 
              in meine .txt Date geschrieben werden, dabei entsteht immer ein Zeilenumbruch zu viel, sodass beim späteren auslesen der Datei ins Array immer eine Leerzeile entsteht mit keinem Inhlat, und dieser leer Datensatz wird leider auch als Link ausgegeben.

              Gibt es eine bessere Möglichkeit das Suchwört in die Datei zu schreiben?

              Kommentar


              • #37
                hängt vom betriebssystem bzw. editor ab probier mal ein einfachen \n.

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

                Kommentar


                • #38
                  Kann es sein, dass der Zeilenumbruch bereits einmal an $search dranhängt ? Schonmal so probiert
                  PHP-Code:
                  fputs($fp,trim($search)."\r\n",256); 
                  Gruss

                  tobi
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #39
                    Mit
                    PHP-Code:
                    fputs($fp,trim($search)."\r\n",256); 
                    hat es auch nicht geklappt.

                    Ich habe jetzt aber noch weiter gedacht
                    und denke das es am besten wäre wenn ich versuche leere Datensätze nicht ins Array zu laden, irgendwie klapt es aber nicht ganz, ich habe dem Script eine if Abfrage zugefügt:
                    PHP-Code:
                    $i=0;
                    $lines=6;
                    $last_lines=array();
                    $fp=fopen('suchworter.txt','r');
                    fseek($fp0SEEK_END);//setzt Dateizeiger an Ende
                    $pos=ftell($fp);
                    //efizientes script holt nur die letzten Wörter aus Datei nich alles aufeinmal
                    while($i<=$lines-1&&!fseek($fp,$pos--))
                     if(
                    fgetc($fp)=="\n"||$pos==0)
                      if(
                    trim(htmlentities(fgets($fp256))) != "") {
                      
                    $last_lines[$i++]=trim(htmlentities(fgets($fp256)));
                      }
                    fclose($fp); 
                    aber die leeren Datensätze werden trotzdem geladen, normal müsste es das aber nicht, den ich prüfe doch mit if(Datensatz nicht "") dann in Array laden und ansonsten nicht, trotzdem habe ich aber am Ende leere Datensätze im Array, kapier ich nicht?
                    Zuletzt geändert von lamoe; 26.12.2006, 21:33.

                    Kommentar


                    • #40
                      Habe ich eine falsche Frage gestellt, mir zu wenig Mühe gegeben oder macht Ihr alle Urlaub weshalb mir niemand mehr hilft ?

                      Lasst mich net hängen Leute so lern ich nie was dazu.

                      Kommentar


                      • #41
                        Testausgaben der Datensätze haben was ergeben ? Einfach alle mal var_dump()-en Ev sind sie nicht leer, sondern enthalten nicht darstellbare Zeichen. Das sollte dir ein var_dump() angeben (z.B. die Länge des Strings).
                        Ausserdem solltest du trimmen bevor du htmlentities() drüberlässt, sonst ersetzt dir htmlentities ein Leerzeichen zu einem &nbsp welches von trim nicht weggeputzt wird.
                        Und sonst
                        PHP-Code:
                        if(trim(htmlentities(fgets($fp256)),'&nbsp;') != "") { 


                        Gruss

                        tobi
                        Zuletzt geändert von jahlives; 27.12.2006, 14:46.
                        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                        Kommentar


                        • #42
                          Hallo, danke für die weitere Hilfe, das habe ich ganz vergessen besser zu erklären was genau passiert, ich werde da in Zukunft besser drauf aufpassen.

                          Ich habe weiter versucht mit der if Abfrage zu verhindern das leere Datensätze ins Array geschrieben werden, aber es hat nicht geklappt.
                          Dann habe ich etwas weiter gedacht und eine Löschfunktion eingebaut die extra noch einmal angeschmiesen werden muss und leider die Performance der Schnelligkeit verschlechtert.

                          PHP-Code:
                          $i=0;
                          $lines=6;
                          $last_lines=array();
                          $fp=fopen('suchworter.txt','r');
                          fseek($fp0SEEK_END);//setzt Dateizeiger an Ende
                          $pos=ftell($fp);
                          //efizientes script holt nur die letzten Wörter aus Datei nich alles aufeinmal
                          while($i<=$lines-1&&!fseek($fp,$pos--))
                           if(
                          fgetc($fp)=="\n"||$pos==0) {
                           if(
                          trim(htmlentities(fgets($fp256)),'&nbsp;') != "") {//Abfrage wenn leerer Datensatz dann nicht in Array speichern, klapt nicht
                                  
                          $last_lines[$i++]=htmlentities(trim(fgets($fp)));
                                  }
                                  }
                          fclose($fp); 
                          Nun mal die Ausgabe bis hier hin was alles im Array steht:
                          PHP-Code:
                          array(6) {
                            [
                          0]=>
                            
                          string(0""
                            
                          [1]=>
                            
                          string(5"mari9"
                            
                          [2]=>
                            
                          string(5"mari8"
                            
                          [3]=>
                            
                          string(5"mari7"
                            
                          [4]=>
                            
                          string(5"mari6"
                            
                          [5]=>
                            
                          string(5"mari5"

                          Wie man sieht Datensatz 0 im Array ist leer, es hat also nicht geklappt mit der if Abfrage.

                          Nun kommen wir mal zu meiner Löschfunktion die ich drunter eingebaut habe.
                          PHP-Code:
                          $ina count($last_lines);// kucken wie viel drin ist
                            
                          for($k=0;$k<$ina;$k++)
                            {
                              if(
                          $last_lines[$k] == "")//Wenn leer dan löschen
                                
                          unset($last_lines[$k]);
                            } 
                          Hier die Ausgabe danach.
                          PHP-Code:
                          array(5) {
                            [
                          1]=>
                            
                          string(5"mari9"
                            
                          [2]=>
                            
                          string(5"mari8"
                            
                          [3]=>
                            
                          string(5"mari7"
                            
                          [4]=>
                            
                          string(5"mari6"
                            
                          [5]=>
                            
                          string(5"mari5"

                          Der leere Datensatz ist nun gelöscht, und mit einer foreach Schleife kann ich auch von oben nach unten ohne das Array nochmal sortieren zu müssen alles ausgeben, also kann ich sagen die Aufgabe ist nun gelöst. Aber warum es oben mit der if Abfrage nicht geklappt hat weis ich nicht und wenn es besser und schneller zu lösen wäre würde ich das auch gerne machen.

                          Kommentar


                          • #43
                            Komisch, dass das mit dem Vergleich zu Leerstring ned funzt. Bei deiner Löschaktion könntest du noch auf ein if verzichten indem du
                            PHP-Code:
                            foreach(array_keys($last_lines,'') as $wert){
                                unset(
                            $last_lines[$wert]);

                            machst.
                            array_keys nimmt einen 2. Parameter der vorgibt welche Keys (in diesem Fall von leeren Einträgen) gesucht werden sollen. Gibt dir ein Array mit den entsprechenden Keys zurück, welches du mittels einer foreach-Schleife einfach durchlaufen kannst.

                            Gruss

                            tobi

                            p.s. hast du mal folgendes probiert ?
                            PHP-Code:
                            //anstatt
                            $last_lines[$i++]=htmlentities(trim(fgets($fp)));
                            //mal so
                            $last_lines[$i]=htmlentities(trim(fgets($fp)));
                            $i+=1
                            Du schreibst gar kein Element 0 in dein Array, weil $i beim ersten Durchlauf 0 ist und durch das Inkrement beim Eintrag auf 1 gesetzt wird. Sprich du trägst kein leeres Element ein, daher funzt auch die if-Abfrage nicht

                            Zuletzt geändert von jahlives; 28.12.2006, 09:51.
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar


                            • #44
                              Hi, zum löschen habe ich jetzt die foreach Schleife genommen, ich denke die ist schneller.

                              Kann man eigentlich mit einer foreach Schleife auch die Funktion trim() auf jedes einzelne Arrayelement anwenden? Zur Zeit Verwende ich dazu die Funktion welche im PHP Handbuch bei trim() steht mit array_walk().

                              Wegen der If Abfrage konnte ich nicht nachvollziehen was du genau meinst und hab es deswegen nicht hinbekommen.
                              Zuletzt geändert von lamoe; 28.12.2006, 13:26.

                              Kommentar


                              • #45
                                Wegen der If Abfrage konnte ich nicht nachvollziehen was du genau meinst und hab es deswegen nicht hinbekommen.
                                Damit meinte ich, dass du auf die Prüfung leeres Element/nicht leeres Element verzichten kannst, wenn du eine Fkt benutzt, die dir die Keys aller Elemente mit leeren Werten zurückgibt.
                                Kann man eigentlich mit einer foreach Schleife auch die Funktion trim() auf jedes einzelne Arrayelement anwenden?
                                Meinst du so ?
                                PHP-Code:
                                foreach($array as $key=>$value){
                                    
                                $array[$key] = trim($wert);

                                Gruss

                                tobi
                                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                                Kommentar

                                Lädt...
                                X