Multi-Array ändern und in eine Datei schreiben

ronin

Erfahrenes Mitglied
Hi.


Ich habe ein kleines Problem.
Ich nutze eine Textdatei um verschiedene Daten abzuspeichern.
Das Format:
Code:
Counter|Wert
------------
1|test
9|jo subba
5|passt scho

Die einzelnen Zeilen werden per "\n" getrennt.
PHP:
$anzahl = count(file($file));
$inhalt = file($file);
$i      = 0;
$found  = FALSE;
while (($i < $anzahl) && (!$found)){
  $copy  = str_replace("\n", "", $inhalt[$i]);
  $array = explode("|", $copy, 2);
  if ($array[1] == $ref){
    $found = TRUE;
    do {
      $fp     = @fopen($file, "w+");
      $locked = flock($fp, 2);
      if ($locked){
        $array[0]++;
        $inhalt[$i] = $array[0]."|".$array[1]."\n";
        fputs($fp, $inhalt);
        flock($fp, 3);
        fclose($fp);
        exit();
      } else {
        fclose($fp);
        usleep(10);
      }
    } while (!$locked);
  }
  $i++;
}

Ich bekomme einen Fehler bei fputs();. Er schreibt mir dann nur "Array" in das Textfile ... er will mir wohl sagen, dass es ein Array ist. ;-)

Also: Ich will einen Teil eines multidimensionalen Arrays ändern und wieder in die Datei speichern. So sollte es eigenlich klappen ... kann mir jedoch jemand sagen warum doch nicht und wie es besser wäre?

Für Hilfe und Tips bin ich dankbar!
Danke und Grüße, Ronin



P.S. Die Suche hat nix ergeben.
P.P.S Die Tutorials auch nicht.
 
Mach stat
PHP:
fputs($fp, $inhalt);
das hier:
PHP:
fputs($fp, $inhalt[$i]);

Aber ich glaub das erste str_replace ($copy = str_replace("\n", "", $inhalt[$i]);) macht sowieso keinen Sinn, weil die Funktion file() sowieso Zeile für Zeile liest!


<edit>Und nochwas: Diese Zwei Zeilen:
PHP:
$anzahl = count(file($file));
$inhalt = file($file);
solttest du in diese ändern:
PHP:
$inhalt = file($file);
$anzahl = count($inhalt);
Ist resourcenschonender!
 
Zuletzt bearbeitet von einem Moderator:
Mit mehrdimensionalen Arrays kann ich da nicht entdecken.
Ändere fputs($fp, $inhalt); in fputs($fp, $inhalt[$i]); dann sollte es gehen.

Edit: Argh, wiedereinmal jemand vor mir. :mad: ;)
 
@Nuinmundo
Habsch geändert. Danke sehr!


Wenn ich das hier schreibe:
PHP:
fputs($fp, $inhalt[$i]);
schreibt er mir nur eine Zeile, respektive er überschreibt das vorherige. Da der $fp nicht mehr auf die bestimmte Zeile zeigt, an die ich schreiben will, geht das wohl nicht.

1) Gibts keine Möglichkeit das gesamte Array als ganzes in die Datei zu schreiben?
2) Kann ich nicht an eine bestimmte Zeile der Datei schreiben?


Das str_replace macht schon Sinn. In der Definition heißt es, die Zeilenumbruch bleibt erhalten. Also muß er raus replaced werden. ;-)


Problem besteht also weiterhin. Any comments?


Grüße und Danke, Ronin
 
Zuletzt bearbeitet:
Dann währe die richtige Methode wohl a+ nicht w+, denn w+ setzt den Pointer immer an den Anfgang der Datei, a+ ans Ende.
 
Zuletzt bearbeitet:
Ich will eine vorhandene Zeile durch eine andere ersetzen. Ob der Zeiger am Anfang oder Ende steht ist doch wurscht. :)


Ich habe das:
PHP:
1|test
4|blubber
9|gnarfst
7|zedff

Die Zeile "4|blubber" möchte ich durch "5|blubber" ersetzen.

So solls dann aussehen:
PHP:
1|test
5|blubber
9|gnarfst
7|zedff


Wie?


Grüße + THX, Ronin
 
Eine Fehlermeldung als solchen gibt es nicht.
Ich bin wieder von
PHP:
fputs($fp, $inhalt[$i]);
weg, weil ich leider nicht an eine bestimmte Zeile schreiben kann.
Mit
PHP:
fputs($fp, $inhalt);
steht dann in meiner Textdatei einfach nur "Array".

Das dürfte damit zusammen hängen, da ich versuche ein Array ohne Index anzusprechen. Denke ich zumindest. :)

Ich könnte das ganze Array per implode in einen String verwandeln. Aber das ist mir zu doof. Außerdem frißt es Ressourcen. :(


Kann ich ein Array nicht komplett ansprechen?


Grüße, Ronin
 
Ja das stimmt mit dem "Array".
Soweit ich weiss nicht, aber du kannst ja einfach nochmal eine Schleife dort einbauen, der alles reinschreibt.

PHP:
for($r = 0; $r <= $anzahl; $r++) {
fputs($fp, $inhalt[$r]);
}
 
Nunja, es ist ne Notlösung.
Aber besser als nix. :)


Für weitere Ideen bin ich offen. Einfach posten ... traut euch schon. *fg*



Grüße + Danke, Ronin
 
Zurück