Nad Flanders: bestimmte Zeile eines Arrays ausgeben lassen

Hallo,

zum löschen einer Datei und zum Austragen dieser aus einer Liste nutze ich folgendes Script:

<?php
$datei = "handle_sg.txt"; // Name der Datei
$array = file($datei); // Datei in ein Array einlesen
$Id = $_POST["Id"];
// Daten löschen
if ($_POST) { // Wurden Daten über $_POST gesendet?
 if (count($array) > 0) { // Sind Daten in $array vorhanden?
  if (isset($_POST["Id"])) { // Ist die Variable $_POST["Id"] vorhanden?
   if (count($_POST["Id"]) > 0) {

// Enthällt $_POST["id"] Daten?
    for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
     // Die Variablen ($kategorie, $beschreibung, $homepage, $datum, $id)
     //  aus dem Array ($array[$zaehler]) holen. Wichtig ist dabei nur die Variable $id
     list($Stelle, $templink, $timestamp, $status, $Name, $Vorname, $email, $Stellensuche, $VGS_vorh, $VGS, $Id, $Ip, $PubDate, $Comment, $Request) = explode("|", $array[$zaehler]);
     foreach ($_POST["Id"] as $element) {
      if ($element == $Id) { // Variablen vergleichen
       array_splice($array, $zaehler, 1); // Einen Teilbereich aus dem Array entfernen
      }
     }
    }
    // Daten speichern
    $text = implode("", $array); // Das Array in einen String zusammenfügen
    $handler = fOpen($datei, "w");
    fWrite($handler, $text);
    fClose($handler);
    $array = file($datei); // Geänderte Datei einlesen
   }
  }
 }

unlink ($templink);

}

$ref = $HTTP_SERVER_VARS["HTTP_REFERER"];
header('Location: '.$ref.' ');

?>

Das funktioniert auch ganz gut.
Jetzt möchte ich das Script umbauen:
Die Zeile die gelöscht wird, soll nun geändert wieder eingefügt werden. Ich versuche nun erstmal diese Zeile per echo auszugeben:

echo $array[$Id];

funktioniert lieder nicht.
  echo $array[2]; gibt Zeile drei aus. ICh möchte aber genau die Zeile ausgegeben bekommen, die zur Id gehört.
Könnt ihr mir das vielleicht ein bisschen auf die Sprünge helfen?

Lg,
Nad

  1. echo $begrüßung;

    $Id = $_POST["Id"];

    Hiermit kopierst du den Wert in eine weitere Variable um. $Id verwendest du aber gar nicht weiter, stattdessen überschreibst du den Wert etwas später (in einem list()-Konstrukt). Diese Zeile ist also sinnlos. Außerdem hast du dich nicht überzeugt, ob dieser Wert überhaupt existiert. Das machst du erst anschließend.

    $text = implode("", $array); // Das Array in einen String zusammenfügen
        $handler = fOpen($datei, "w");
        fWrite($handler, $text);
        fClose($handler);
        $array = file($datei); // Geänderte Datei einlesen

    Letzteres ist überflüssig, denn $array verliert ja nicht seinen Inhalt durch das implode(). Allerdings scheint mir dein glue-Parameter bei implode() nicht richtig zu sein. Du verlierst alle Zeilenumbrüche. Die letzte Zeile wird nur $array mit einem einzelnen Element liefern. Brauchst du $array eigentlich noch? Du verwendest es anschließend gar nicht, zumindest nicht in dem geposteten Code. Obendrein ist es kein besonders aussagekräftiger Bezeichner.

    $ref = $HTTP_SERVER_VARS["HTTP_REFERER"];

    $HTTP_SERVER_VARS ist schon seit vielen Wintern nicht mehr aktuell. Genauso wie es nun $_POST statt $HTTP_POST_VARS heißt es $_SERVER.

    header('Location: '.$ref.' ');

    Dass der Referrer, da es ein vom Client beliebig beeinflussbarer Wert ist, nicht unbedingt eine und auf keinen Fall immer nur die von dir vorgesehene vertrauenswürdige URL enthalten muss, scheint dir auch nicht bewusst zu sein.

    funktioniert lieder nicht.

    "Funktioniert nicht" funktioniert nicht. Beobachte und beschreibe genauer, wenn du genauere Antworten erwartest! Hast du dir mit Kontrollausgaben anzeigen lassen, womit du worauf zuzugreifen versuchst?

    echo $array[$Id];

    Ist das das nunmehr einelementige Array?

    echo $array[2]; gibt Zeile drei aus. ICh möchte aber genau die Zeile ausgegeben bekommen, die zur Id gehört.

    Oder an welcher Stelle deines geposteten Codes versuchst du die Änderungen vorzunehmen? Unterhalb des implode() und file() gibt es ja nur noch Element 0.

    Die Zeile die gelöscht wird, soll nun geändert wieder eingefügt werden.

    Möchtest du damit sagen, dass nun statt des Löschens ein Ändern stattfinden soll? Innerhalb der for-$zähler-Schleife hast du doch schon mit $array[$zaehler] einen lesenden Zugriff auf das aktuelle Element. Bekommst du einen schreibenden darauf nun allein hin?

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Hi

      Möchtest du damit sagen, dass nun statt des Löschens ein Ändern stattfinden soll? Innerhalb der for-$zähler-Schleife hast du doch schon mit $array[$zaehler] einen lesenden Zugriff auf das aktuelle Element. Bekommst du einen schreibenden darauf nun allein hin?

      In den von dir genannten Punkten gelobe ich Besserung bzw. Änderung.
      Die Geschichte mit dem redirect zur Ref. Seite werde ich auch noch ändern.
      Also kann ich die Zeile die gelöscht wird mit echo  $array[$zaehler] aufrufen?

      Nochmal was zu der Funktion des Scriptes:

      Du hast recht, die Zeile soll nicht mehr gelöscht werden, sondern "rausgepickt", geöffnet(explode) werden und ich will einige Strings darin ändern, im Anchluss soll sie wieder in die Datei sg_handle.txt eingefügt werden. Idealerweise an der Stelle, an der sie entnommen wurde.

      Lg;
      Nad

      echo "$verabschiedung $name";

      1. echo $begrüßung;

        Also kann ich die Zeile die gelöscht wird mit echo  $array[$zaehler] aufrufen?

        Du greifst ja schließlich auch jetzt schon lesend darauf zu, also kannst du auf gleiche Weise auch schreibend darauf zugreifen.

        Du hast recht, die Zeile soll nicht mehr gelöscht werden, sondern "rausgepickt", geöffnet(explode) werden und ich will einige Strings darin ändern, im Anchluss soll sie wieder in die Datei sg_handle.txt eingefügt werden. Idealerweise an der Stelle, an der sie entnommen wurde.

        Ein Schreibzugriff über den Array-Key ändert an der Position im Array nichts.

        echo "$verabschiedung $name";

        1. Du greifst ja schließlich auch jetzt schon lesend darauf zu, also kannst du auf gleiche Weise auch schreibend darauf zugreifen.

          also mit:
          echo $array[$zaehler]

          bekomme ich nur eine leere Seite ausgegeben.....

          Lg,
          Nad

          1. echo $begrüßung;

            Du greifst ja schließlich auch jetzt schon lesend darauf zu, also kannst du auf gleiche Weise auch schreibend darauf zugreifen.

            also mit:
            echo $array[$zaehler]
            bekomme ich nur eine leere Seite ausgegeben.....

            Ich weiß nicht, an welcher Stelle du das hingeschrieben hast. Du schriebst aber, dass dein bisheriger Quelltext "auch ganz gut" funktioniere. Da drin steht ein Lesezugriff mit $array[$zaehler] der essentiell für die Funktionsweise ist. Also muss an der Stelle ein Inhalt vorhanden sein.

            Eine leere Seite kann auch bedeuten, dass der Browser zwar etwas übergeben bekommt, nach dem Parsen aber nichts zum Darstellen übrigblieb. Ein Blick in den Quelltext der Seite kann aufklären.

            Weiterhin eignet sich var_dump() deutlich besser zur Kontrollausgabe von Variableninhalten als ein echo.

            echo "$verabschiedung $name";

            1. echo $begrüßung;

              Du greifst ja schließlich auch jetzt schon lesend darauf zu, also kannst du auf gleiche Weise auch schreibend darauf zugreifen.

              also mit:
              echo $array[$zaehler]
              bekomme ich nur eine leere Seite ausgegeben.....

              Ich weiß nicht, an welcher Stelle du das hingeschrieben hast. Du schriebst aber, dass dein bisheriger Quelltext "auch ganz gut" funktioniere. Da drin steht ein Lesezugriff mit $array[$zaehler] der essentiell für die Funktionsweise ist. Also muss an der Stelle ein Inhalt vorhanden sein.

              ...recht hat er, geschrieben hat er es auch schon mal:

              wenn ich vor implode() aufrufe, funktioniert es.
              Die ausgegebene Zeile wird inkl. trenner angezeigt, ich gehe davon aus, dass sie mit explode aufschlüsseln kann and mit strg_replace die Variablen ändern kann, right?

              Apropos: Du hast geschrieben, dass es bei implode Probleme geben könnte und mein Zeilumbruch weg ist. Ich habe geschaut, er ist noch da.

              Weiterhin eignet sich var_dump() deutlich besser zur Kontrollausgabe von Variableninhalten als ein echo.

              Das werde ich mir merken.Danke.

              Wie bekomme ich den geänderten Text dann wieder in die Datei hinein?
              Zuerst ändere ich ihn. Ist klar.
              Im nächsten Schritt fasse ich ihn wieder mit implode zusammen.
              Ab jetzt wird es unklar,mit
              array_splice($array, $zaehler, 1);

              entferne ich die Zeile ja komplett, aber wie füge ich Sie wieder ein?

              Lg,
              Nad

              1. echo $begrüßung;

                Die ausgegebene Zeile wird inkl. trenner angezeigt, ich gehe davon aus, dass sie mit explode aufschlüsseln kann and mit strg_replace die Variablen ändern kann, right?

                Nachdem du die Zeile mit explode() aufgetrennt hast, liegen die einzelnen Werte in einem Array vor. Ich tät dieses im Ganzen lassen anstatt es mit list() in einzelne Variablen aufzuteilen. Ändere einen dieser Werte, indem du ihn einfach überschreibst. Dieses Array kannst du anschließend implodieren und damit die aktuelle Zeile des Zeilen-Arrays überschreiben.

                Apropos: Du hast geschrieben, dass es bei implode Probleme geben könnte und mein Zeilumbruch weg ist. Ich habe geschaut, er ist noch da.

                Stimmt. file() lässt ihn ja hintendran. Allerdings hat dann dein letzter Wert der Zeile immer einen Zeilenumbruch hintendran. Besser wäre es, wenn du file() mit der Konstante FILE_IGNORE_NEW_LINES als zweitem Parameter aufriefst und beim implode() den Zeilenumbruch einfügtest.

                Wie bekomme ich den geänderten Text dann wieder in die Datei hinein?
                Zuerst ändere ich ihn. Ist klar.
                Im nächsten Schritt fasse ich ihn wieder mit implode zusammen.
                Ab jetzt wird es unklar,mit
                array_splice($array, $zaehler, 1);
                entferne ich die Zeile ja komplett, aber wie füge ich Sie wieder ein?

                Lass das Löschen weg und überschreib das Array-Element einfach indem du ihm die geänderte Zeile zuweist.

                echo "$verabschiedung $name";

                1. SÖÖÖÖÖÖÖ,

                  also soweit bin ich jetzt:
                  Die von mir gewünschte Zeile wird ausgelesen, die Variable überschreibe ich, aber wie bekomme ich die Zeile wieder in das Array hinein?

                    
                   $text = implode("",$array);  
                  
                  

                  Hier nochmal der Code im Gesamten:

                    
                  <?php  
                  $datei = "handle_sg.txt"; // Name der Datei  
                  $array = file($datei); // Datei in ein Array einlesen  
                    
                  // Daten löschen  
                  if ($_POST) { // Wurden Daten über $_POST gesendet?  
                   if (count($array) > 0) { // Sind Daten in $array vorhanden?  
                    if (isset($_POST["Id"])) { // Ist die Variable $_POST["Id"] vorhanden?  
                     if (count($_POST["Id"]) > 0) {  
                        // Enthällt $_POST["id"] Daten?  
                      for ($zaehler = 0; $zaehler < count($array); $zaehler++) {  
                       // Die Variablen ($kategorie, $beschreibung, $homepage, $datum, $id)  
                       //  aus dem Array ($array[$zaehler]) holen. Wichtig ist dabei nur die Variable $id  
                       list($Stelle, $templink, $timestamp, $status, $Name, $Vorname, $email, $Stellensuche, $VGS_vorh, $VGS, $Id, $Ip, $PubDate, $Comment, $Request) = explode("|",     $array[$zaehler]);  
                    foreach ($_POST["Id"] as $element) {  
                       if ($element == $Id) { // Variablen vergleichen  
                   $status ="1";  
                     }  
                    }  
                      }  
                      // Daten speichern  
                      $text = implode("",$array); // Das Array in einen String zusammenfügen  
                      $handler = fOpen($datei, "w");  
                      fWrite($handler, $text);  
                      fClose($handler);  
                      $array = file($datei); // Geänderte Datei einlesen  
                     }  
                    }  
                   }  
                  }  
                  $ref = $_SERVER["HTTP_REFERER"];  
                  header('Location: '.$ref.' ');  
                  ?>  
                  
                  

                  Schon mal nen ganz dickes Dankeschön für deine bisherige Hilfestellung,

                  Nad

                  1. Hi,

                    Die von mir gewünschte Zeile wird ausgelesen, die Variable überschreibe ich, aber wie bekomme ich die Zeile wieder in das Array hinein?

                    Was hast du denn bitte an

                    überschreib das Array-Element einfach indem du ihm die geänderte Zeile zuweist.

                    nicht verstanden?

                    $arrayVariable[$index] = "neuer Inhalt";

                    Soo schwer ...?

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
                    1. $arrayVariable[$index] = "neuer Inhalt";

                      Soo schwer ...?

                      MfG ChrisB

                      ....für dich nicht, für mich schon......tja, so ist das auf der Welt...jeder MEnsch hat sein Qualitäten.
                      Wie würde:
                      $arrayVariable[$index] = "neuer Inhalt";

                      in meinem Fall aussehen, mal abgesehen von "neuer Inhalt"?

                      1. Hi,

                        Wie würde:
                        $arrayVariable[$index] = "neuer Inhalt";

                        in meinem Fall aussehen, mal abgesehen von "neuer Inhalt"?

                        Darueber solltest du jetzt mal selber ein bisschen nachdenken.

                        MfG ChrisB

                        --
                        „This is the author's opinion, not necessarily that of Starbucks.“
                        1. Darueber solltest du jetzt mal selber ein bisschen nachdenken.

                          MfG ChrisB

                          Hätte ich das nicht schon gemacht und nicht schon verschiedene Versuche unternommen, das Problem allein zu lösen, würde ich nicht fragen.

                          Lg;
                          Nad

                          1. Hi,

                            zitiere doch bitte endlich mal vernuenftig!

                            Hätte ich das nicht schon gemacht und nicht schon verschiedene Versuche unternommen, das Problem allein zu lösen, würde ich nicht fragen.

                            Und wenn du hier fragst, dann gilt zeige her, *was* du versucht hast - und nicht, jammere, dass alles "nicht gefunzt" haette.

                            MfG ChrisB

                            --
                            „This is the author's opinion, not necessarily that of Starbucks.“
                            1. hmmmmmmm....mein Problem ist damit aber noch immer nicht gelöst: Ich versuche die geänderte Zeile wieder in das Array einzufügen.  Meine Frage lautet also nach wie vor:

                              Wie würde:
                              $arrayVariable[$index] = "neuer Inhalt";

                              »»

                              in meinem Fall aussehen, mal abgesehen von "neuer Inhalt"?

                              Nad

                              1. Hi,

                                hmmmmmmm....mein Problem ist damit aber noch immer nicht gelöst: Ich versuche die geänderte Zeile wieder in das Array einzufügen.  Meine Frage lautet also nach wie vor:

                                Abgesehen davon, dass dedlfix dir dazu auch noch mal geantwortet hat: Mit bestaendiger Wiederholung der immer gleichen Frage kommst du bei mir nicht weiter. Was du tun sollst, schrieb ich bereits.

                                MfG ChrisB

                                --
                                „This is the author's opinion, not necessarily that of Starbucks.“
                                1. Alter,
                                  ich glaub du hast nen vollen Treffer.Lies einfach mal was du geschrieben hast:
                                  Ich stellte eine Frage, du gabst mir eine allgemeine Antwort, auf meine Frage hin, wie sich das Problem in meinem speziellem Fall lösen lässt, hast du geschrieben, ich solle nachdenken. Was ich tat. Da ich aber nicht so nen doller PHP Profi wie du bin, bin ich mit meinem Nachdenken nicht zum gewünschten Ergebnis gekommen. Sorry, dass ich PHP nicht so gut kann wie du, sorry auch dafür, dass ich falsch zitiere, ich füle mich so schäbig deswegen. Wirklich.
                                  Du bist mir sowas von überlegen......Hammer.

                                  Wie auch immer, als ich mit Tränen in den Augen festgestellt habe, dass ich nicht weiter komme, hab eich mich dazu entschlossen, einen weiteren Versuch zu wagen, und hier mal vorsichtig anzufragen. Wohlwissend, dass ich wahrscheinlich eine unsachliche Antwort bekomme und zwar von dir. Eine Wette hätte ich abschließen sollen.....
                                  Wie auch immer....deine Posts quellen vor Unsachlichkeit und Kritik an anderen Personen nur so über. Sei es drum, aber lass mich da bitte raus.Antworte doch einfach gar nicht.
                                  Ich kann mir nicht helfen, aber irgendwie war die Diskussion bis zu dem Zeitpunkt an dem du dich eingeklinkt hast sachlich, ich habe dazu gelernt und bin entscheiden Schritte weiter gekommen.
                                  Wie gesagt...bis zu einem gewissen Punkt.....Und jetzt lass mich bitte endlich in Ruhe, fühle dich durch meine Fragen im Forum nicht angesprochen oder ignoriere Diese......ich weiss nun, dass ich nicht so nen doller Hecht wie du bin....

                                  Bye

                                  1. Hi,

                                    zum deinem ganzen selbstmitleidigem Gejammer: Heul doch.

                                    Und zu deinem Problem - wo soll es denn bitte liegen?

                                    Du wirst wohl wissen, wie man einer Variablen einen Wert zuweist, oder?
                                    Und auch fuer die Syntax, wie man das bei einer Variable, die ein Element eines nummerisch indizierten Arrays ist, macht, hast du ein Beispiel bekommen.

                                    Also musst du das jetzt doch nur noch auf deinen Code uebertragen ... du solltest wissen, wie dein Array heisst - ist ja schliesslich dein Code, nicht wahr; und du weisst ja offenbar schon, wie du auf das richtige Element des Arrays lesend zugreifst - also ist der umgekehrte, schreibende Zugriff doch wohl eine absolute Trivialitaet.

                                    Und das hat nichts mit toller Hecht oder nicht zu tun, sondern mit fuer Fuenf Cent mal kurz logisch Nachdenken.

                                    Wenn du damit wirklich noch ein Problem hast, dann beschreibe dieses Problem - aber jammere bitte nicht wiederholt rum, dass es dir jemand an exakt deinem Code zeigen muesse, weil du sonst zu dumm dafuer waerst.

                                    MfG ChrisB

                                    --
                                    „This is the author's opinion, not necessarily that of Starbucks.“
                                    1. Auf ein Neues:

                                      Heulen tut hier mal gar niemand, naja und für Selsbtmitleid habe ich gerade keine Zeit. Sei es drum. ICh habe den Code nochmal umgebastelt. Hier die neue Version:

                                        
                                      <?php  
                                      $datei = "handle_sg.txt"; // Name der Datei  
                                      $array = file($datei); // Datei in ein Array einlesen  
                                        
                                      // Daten löschen  
                                      if ($_POST) { // Wurden Daten über $_POST gesendet?  
                                       if (count($array) > 0) { // Sind Daten in $array vorhanden?  
                                        if (isset($_POST["Id"])) { // Ist die Variable $_POST["Id"] vorhanden?  
                                         if (count($_POST["Id"]) > 0) {  
                                            // Enthällt $_POST["id"] Daten?  
                                          for ($zaehler = 0; $zaehler < count($array); $zaehler++) {  
                                           // Die Variablen ($kategorie, $beschreibung, $homepage, $datum, $id)  
                                           //  aus dem Array ($array[$zaehler]) holen. Wichtig ist dabei nur die Variable $id  
                                           list($Stelle, $templink, $timestamp, $status, $Name, $Vorname, $email, $Stellensuche, $VGS_vorh, $VGS, $Id, $Ip, $PubDate, $Comment, $Request) = explode("|",     $array[$zaehler]);  
                                        foreach ($_POST["Id"] as $element) {  
                                           if ($element == $Id) { // Variablen vergleichen  
                                       $status ="1";  
                                      $line_to_change ="$array[$zaehler]";  
                                      $array_extracted_strings = explode("|", $line_to_change);  
                                      //echo $line_to_change;  
                                      $array_extracted_strings  = array($Stelle, $templink, $timestamp, $status, $Name, $Vorname, $email, $Stellensuche, $VGS_vorh, $VGS, $Id, $Ip, $PubDate, $Comment, $Request);  
                                      $status = "1";  
                                      $new_string= implode("|", $array);  
                                      $datei = "handle_sg.txt";  
                                      $linklist = file_get_contents($datei);  
                                      $array = file($datei); // Datei in ein Array einlesen  
                                      $linklist = str_replace(''.$line_to_change.'', ''.$new_string.'',$linklist);  
                                      // Datei öffnen  benennen und speichern  
                                      $file_name_1 = 'handle_sg.txt';  
                                      $fp = fopen($file_name_1, 'w');  
                                      if (!$fp) {  
                                      trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);  
                                      return;  
                                      }  
                                      fputs($fp,$linklist);  
                                      fclose($fp);  
                                       }  
                                        }  
                                          }  
                                         }  
                                        }  
                                       }  
                                      }  
                                      //$ref = $_SERVER["HTTP_REFERER"];  
                                      //header('Location: '.$ref.' ');  
                                      ?>  
                                      
                                      

                                      So mein Anliegen ist nun, aus $array_extracted_strings den String Status zu ändern. Einen Versuch habe ich bereits unternommen und bin dabei leider (ohne Emotionen) gescheitert.
                                      Meine konkrete Frage:
                                      Wie überschreibe ich einen String aus $array_extracted_strings bevor dieser wieder implodiert.
                                      Der Code ist noch unsauber und muss noch aufgeräumt werden.

                  2. echo $begrüßung;

                    Die von mir gewünschte Zeile wird ausgelesen, die Variable überschreibe ich, aber wie bekomme ich die Zeile wieder in das Array hinein?

                    list($Stelle, $templink, $timestamp, $status, $Name, $Vorname, $email, $Stellensuche, $VGS_vorh, $VGS, $Id, $Ip, $PubDate, $Comment, $Request) = explode("|",     $array[$zaehler]);

                    Hier erstellst du mit großem Aufwand aus dem von explode() zurückgegebenen Array einzelne Variablen, brauchst davon aber nur einen Wert zum vergleichen und einen willst du ändern. Lass doch das list() weg und belasse das explode()-Ergebnis-Array als solches zusammen.

                    $values = explode(...);

                    Deinen bisher in $Id vorliegenden Wert findest du nun in $values[10]. Den zu ändernden Wert überschreibst du einfach. Angenommen es wäre die Email-Adresse. Die befindet sich an Position 6 (von 0 an gezählt) und kann mit $values[6] = 'was neues'; geändert werden. Nun implodierst du $values wieder mit dem | als Trennzeichen und überschreibst $array[$zaehler] damit.

                    echo "$verabschiedung $name";