Array sortieren

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

  • Array sortieren

    Hi, ich will eine Art Livesuche anbieten, wo die zuletzt gesuchten Wörter angezeigt werden.

    Dazu habe ich alle Suchwörter in eine .txt Datei geschrieben und in ein Array geladen, die zuletzt eingegebenen Suchwörter stehen immer an letzter Stelle des Arrays.

    Nun will ich einfach der Reihe nach die letzten 10 Suchwörter mit einer Schleife ausgeben, also die Suchwörter die am Ende des Array stehen.

    Mein Problem hierbei zurzeit ist, ich bekomme das Array nicht so sortiert, dass die letzteren Datensätze nach vorne kommen, ohne das alphabetisch oder sonst wie sortiert wird!

    Falls jemand mir aber komplett eine besser Lösung nennen kann um das ganze zu erreichen ohne eine datenbank benutzen zu müssen, wäre das auch ganz toll.

  • #2
    du liest die komplette txt-datei in ein array ein?
    und was, wenn die txt-datei irgendwann tausende von suchbegriffen beinhalten wird und die datei 10 oder 20 mb groß wird? das wird absolut ineffizient, ist dir das bewusst?

    du musst schon mit einer schleife und fgets() immer nur 10 zeilen auslesen, bis die datei zu ende ist, dann hast du die letzten 10 zeilen und musst sie nur noch in der umgekehrten reihenfolge ausgeben lassen.

    Kommentar


    • #3
      Hi, gut das du mich drauf hingewiesen hast, da habe ich gar nicht dran gedacht, ich nehme jetzt also fgets().

      Aber mit dem rückwärts sortieren komme ich noch nicht zurecht, wenn ich rsort() nehme, wird zwar etwas geordnet, aber nicht richtig wie es sein sollte, ich glaub es wird mit rsort() nur alphabetisch rückwarts sortiert, ich will es aber ohne alphabetisch oder sonst was rückwarts geordnet haben.

      Kommentar


      • #4
        du sollst auch nichts sortieren.
        du hast am ende ein array mit 10 elementen. gib das rückwärts aus, d.h. schick den index nich von 0 bis 9, sondern anders herum, von 9 bis 0.

        Kommentar


        • #5
          Also du meinst eine Schleife rückwärts ausgeben, habe ich noch nie gemacht, aber ich denke das könnte ich schaffen.

          Ansonsten habe ich eben noch grad den Tipp bekommen das man mit [PHPf]array_reverse()[/PHPf] so sortieren kann wie ich es wollte.

          Was für ein int length muss man den genau eingeben bei fgets damit nur 10 Zeilen eingelesen werden? Ich speichere meine Suchwörter ohne Zeilenumbruch nebeneinander getrennt durch | und mit explode tue ich die dann in ein Array laden, kann man da überhaupt nur eine bestimmte Anzahl an Zeilen oder Suchwörtern rausholen?

          Kommentar


          • #6
            zeilenumbruch wäre natürlich besser, denn dann hört fgets selbst auf zu lesen, wenn "\n" erreicht wurde. für die maximale länge kannst du eine obere schranke für die suchbegrifflänge angeben, z.b. ein kilobyte.
            Ansonsten habe ich eben noch grad den Tipp bekommen das man mit [PHPf]array_reverse()[/PHPf] so sortieren kann wie ich es wollte.
            ist nicht notwendig.
            ... explode tue ich die dann in ein Array laden
            dafür muss man vorher alles eingelesen haben, die problematik ist weiter oben beschrieben.

            Kommentar


            • #7
              Original geschrieben von penizillin
              dafür muss man vorher alles eingelesen haben, die problematik ist weiter oben beschrieben.
              Ich muss doch aber explode() benutzen, weil fgets() doch nur ein String zurückgibt, oder gibt es eine andere Funktion die wie fgets arbeitet und ein array zurückgibt?

              edit:

              Ich glaue mit dem Schleife Rückwärts laufen wird es nicht klappen, weil ich weis ja nie wieviel Datensätze nun im Array sind, der letzte Datensatz kann Nummer 40 aber auch 50 sein und die Schleife muss dann wieder dementsprechend geändert werden, mit array_reverse() kann ich aber immer davon ausgehen das es bei 0 anfängt und kann so meine 0-9 laufen lassen.
              Zuletzt geändert von lamoe; 24.12.2006, 20:52.

              Kommentar


              • #8
                wie gesagt, ersetze "|" durch zeilenumbrüche.
                dann kannst du mittels fgets immer eine zeile einlesen und diese in ein array stecken. manuell.

                Kommentar


                • #9
                  Wie schreibe ich den das fgets() damit es genau 10 Zeilen raus holt, wenn ich auch Zeilenumbrüche rein mache? Etwas so:
                  PHP-Code:
                  fgets($handle10); 

                  Kommentar


                  • #10
                    fgets holt immer nur eine, rtfm. der zweite parameter ist die maximale anzahl bytes, die gelesen werden.

                    Kommentar


                    • #11
                      Und was ist jetzt eine rtfm?
                      Und wie muss es aussehen damit nun 10 Zeilen bzw. 10 Suchwörter geholt werden?
                      Muss ich überhaupt den zweiten Parameter benutzen?
                      Tut mir leid, aber ich habe echt keine Ahnung.

                      Kommentar


                      • #12
                        Und was ist jetzt eine rtfm?
                        www.php.net/fgets
                        Und wie muss es aussehen damit nun 10 Zeilen bzw. 10 Suchwörter geholt werden?
                        in einer schleife, bis datei-ende erreicht wird. die 10 "aktuellen" zeilen musst du buffern, sodass wenn dateiende kommt, du darauf zugreifen kannst.
                        Muss ich überhaupt den zweiten Parameter benutzen?
                        solltest du.
                        Tut mir leid, aber ich habe echt keine Ahnung.
                        die aufgabe ist wirklich nicht einfach.

                        Kommentar


                        • #13
                          Was rtfm ist habe ich immer noch nicht rausbekommen, ich habe auch vorher schon die Funktion fgets() in mein PHP Manuell gelesen.

                          Mein kleines Script sieht zur Zeit so aus:
                          PHP-Code:
                          $handle fopen ("suchworter.txt""r");
                          for (
                          $x 0$x 10$x++){
                              
                          $buffer fgets($handle1024);
                              echo 
                          $buffer.'<br>';
                          }
                          fclose ($handle); 
                          Es holt mir aber die 10 ersten Wörter aus der .txt Datei und nicht die letzten.

                          Dann muss ich noch anmerken, dass natürlich die suchworter.txt Datei schneller groß wird wenn man immer jedes Wort per Zeilenumbruch rein schreibt, als nebeneinander.

                          Kommentar


                          • #14
                            Dann muss ich noch anmerken, dass natürlich die suchworter.txt Datei schneller groß wird wenn man immer jedes Wort per Zeilenumbruch rein schreibt, als nebeneinander.
                            das ist ein irrtum, ein zeilenumbruch ist genau so _ein_ zeichen wie das "|".

                            das sieht doch schon gut aus. ersetze nun die for schleife durch eine while-schleife und als abbruchbedingung nimm feof().

                            Kommentar


                            • #15
                              Was ist rtfm?

                              Ich hab es jetzt mit einer while Schleife gemacht wie im Handbuch als Beispiel und von dir vorgeschlagen, aber es wird so jetzt immerhin die komplette suchworter.txt Datei eingelesen, was doch nicht so gut war aus performance gründen oder nicht:

                              PHP-Code:
                              $handle fopen ("suchworter.txt""r");
                              while (!
                              feof($handle)) {
                                  
                              $buffer fgets($handle1024);
                                  echo 
                              $buffer.'<br>';
                              }
                              fclose ($handle); 
                              Und wie komm ich nun an meine letzten 10 Wörter, muss ich alles in ein array exploden?

                              Für heute aber erst mal gute Nacht.

                              Kommentar

                              Lädt...
                              X