deleteLineFromFile & txtArray

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

  • deleteLineFromFile & txtArray

    Guten Tag.

    Die Problematik ist folgende :
    Ich habe ein script 1.php, auf welchem jede Linie einer Textdatei in ein array gelesen und mit einer Textbox vorne dran ausgegeben wird. Nun soll man Linien anChecken können, die durch script 2.php dann in einer .txt gelöscht werden.

    Problem I : Die online verbreitete Funktion deleteLineFromFile funktioniert soweit wunderbar, wurde von mir in eine foreach-Schleife gepackt und soll für jedes Element im Array der checkboxen die Line mit der selben nummer in der txt löschen. Löscht aber immer nur das erste element im array.

    Problem II : Wird der letzte Eintrag der Reihe gelöscht, löscht die Funktion zwar den Inhalt der dazugehörigen Textzeile, jedoch den Zeilenumbruch \n nicht.

    Function deleteLineFromFile in 2.php
    (parameter $text momentan überflüssig; für textbasierte Suche nach einer Zeile):
    PHP-Code:
    function deleteLineFromFile($filename$text ""$line = -1)
      {
         
    $result true;

         if (! 
    strlen ($text) && $line == -1)
           
    $result false;
         else
         {
            if (
    file_exists($filename))
            {
               
    $array file($filename);

               
    // Zeilennummer?
               
    if ($line != -1)
               {
                  if (
    $line count($array))
                  {
                     unset(
    $array[$line]);
                     
    $array array_values($array);
                  }
                  else
                    
    $result false;
               }
               else
               {
                  if (
    strlen ($text))
                  {
                     
    $count = -1;

                     foreach (
    $array as $value)
                     {
                        
    $value trim ($value);
                        if (
    $text == $value)
                        {
                           
    $count++;
                           unset(
    $array[$count]);
                           
    $array array_values($array);
                           break;
                        }
                        else
                         
    $count++;
                     }
                  }
                  else
                    
    $result false;
               }
            }
            else
              
    $result false;
         }

         if (
    $result true)
         {
             
    $fp fopen ($filename"w");

             if (
    $fp)
             {
                foreach (
    $array as $value)
                  
    fputs($fp$value);

                
    fclose ($fp);
             }
             else
               
    $result false;
         }
         return 
    $result;
      } 
    Die checkboxen im echo der 1.php sind mit name=asdf[] betitelt und tragen fortlaufende values. Das ausgegebene array ist soweit völlig korrekt und trägt - wenn geechoed - tatsächlich jede der angehakten Zeilennummern.

    Weiterer Auszug aus 2.php :
    PHP-Code:
    $asdf $_POST['asdf'];

    foreach (
    $asdf as $chkbox) {
    deleteLineFromFile("myfile.txt"$text=""$chkbox); } 
    Ich wäre für jede Hilfe sehr verbunden und danke vorab schonmal für Eure Zeit,

    fage

  • #2
    Achtung, dein Ansatz enthält einen Denkfehler!
    Wenn man Zeile 1 und 2 einer dreizeiligen Datei löschen möchte, kann man nicht einfach Zeile 1 löschen und danach Zeile 2, denn Zeile 2 verschiebt sich durch das Löschen.
    Machs rückwärts, lösche die ausgewählten Zeilen von hinten nach vorn!

    Und vergiß diese Funktion, die du da gefunden hast. Sie öffnet die Datei bei jedem Aufruf, liest sie komplett ändert und schreibt sie wieder.

    So könnte es klappen:
    PHP-Code:
    $file file($filename);
    rsort($_POST['asdf']);
    foreach (
    $_POST['asdf'] as $line) {
        unset(
    $file[$line]);
    }
    file_put_contents($filenameimplode(''$file)); 

    Kommentar


    • #3
      Jau, ziemlich blöder Denkfehler...

      Whoa da coded jemand schon in php5...ganz so schnell sind meine Jungs nicht. Vielen Vielen Dank auf jeden Fall für Deine Hilfe !!!
      !
      Ich habe jetzt (da ich das ganze mit 3 txt's machen muss):
      PHP-Code:
      $file file("1.txt");
      $file2 file("2.txt");
      $file3 file("3.txt");
      $chkarr $_POST['asdf'];
      rsort($chkarr);
      foreach (
      $chkarr as $line) {
          unset(
      $file[$line]);
          unset(
      $file2[$line]);
          unset(
      $file3[$line]); }
      implode(''$file);
      implode(''$file2);
      implode(''$file3);
      //file_put_contents($filename, implode('', $file));
      $m1 fopen("1.txt"w);
      fwrite($m1$file);
      fclose($m1);
      $m2 fopen("2.txt"w);
      fwrite($m2$file2);
      fclose($m2);
      $m3 fopen("3.txt"w);
      fwrite($m3$file3);
      fclose($m3); 
      Doch sobald die action losgeht schreibt er in alle 3 txt's nur "Array".
      Irgendwie kommt mir das bekannt vor. Das muss was ganz simples sein, dass ich auch schonmal gefixt hab. Hrm.

      Vielen Dank auf jeden fall nochmals für Deine Hilfe,

      fage

      Kommentar


      • #4
        Original geschrieben von fage
        Doch sobald die action losgeht schreibt er in alle 3 txt's nur "Array".
        Natürlich, weil du ja versuchst direkt die unveränderten Arrays in die Datei zu schreiben.

        Tipp: implode hat einen Rückgabewert ...
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Herrlich. Funktioniert einwandfrei ! Vielen vielen Dank !
          bleibt nur noch

          Problem II : Wird der letzte Eintrag der Reihe gelöscht, löscht die Funktion zwar den Inhalt der dazugehörigen Textzeile, jedoch den Zeilenumbruch \n nicht.
          Aber das müsste ich hinkriegen.

          Thx a lot,

          fage

          Kommentar


          • #6
            Wird doch kritischer, denn egal ob ich es (\n) nur davon abhalten will mit checkbox geechoed zu werden oder von der txt fernhalten will, wird so oder so unset() benötigt, das mein Problem ja nicht beheben kann. Hat jemand einen Funktionstipp für mich ?
            Zuletzt geändert von fage; 27.06.2006, 17:01.

            Kommentar

            Lädt...
            X