[php] zapis do okreslonej lini

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
MiChaSSs
Posty: 18
Rejestracja: czw cze 10, 2004 11:14 pm

[php] zapis do okreslonej lini

Post autor: MiChaSSs »

Cześć. Jak zapisac jakis tekst np. do 60 lini w pliku ??
templar
Nowy
Nowy
Posty: 69
Rejestracja: ndz maja 16, 2004 3:19 pm
Lokalizacja: Kolbuszowa
Kontakt:

Re: [php] zapis do okreslonej lini

Post autor: templar »

musisz odczytac plik do tablicy a później dany element tablicy zmodyfikować, i zapisac jeszcze raz wszystko do pliku
MiChaSSs
Posty: 18
Rejestracja: czw cze 10, 2004 11:14 pm

Re: [php] zapis do okreslonej lini

Post autor: MiChaSSs »

nie mozna tego zrobic w jakis latwiejszy sposob ?? probowalem zrobic tak jak powiedziales ale zapisalo sie tylko "Array"
Wojciech Kocjan
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: sob gru 14, 2002 10:51 am

Re: [php] zapis do okreslonej lini

Post autor: Wojciech Kocjan »

Powinno to wygladac mniej wiecej tak:

[php]<?php
$fileName='dane.txt';
$content=file($fileName);
$content[59]='Nowa linia 60'; // numerowane od zera
$handle=fopen($fileName,'w');
fwrite($handle,$content);
fclose($handle);
?>[/php]
templar
Nowy
Nowy
Posty: 69
Rejestracja: ndz maja 16, 2004 3:19 pm
Lokalizacja: Kolbuszowa
Kontakt:

Re: [php] zapis do okreslonej lini

Post autor: templar »

a nie powinno być wcześniej: $content=join($content);
MiChaSSs
Posty: 18
Rejestracja: czw cze 10, 2004 11:14 pm

Re: [php] zapis do okreslonej lini

Post autor: MiChaSSs »

robilem tak jak Ty Wojtek ale niestety zapisuje sie "Array" :(
Grzegorz Winiarski
Nowy
Nowy
Posty: 147
Rejestracja: pt lut 27, 2004 10:36 pm
Lokalizacja: Kraków

Re: [php] zapis do okreslonej lini

Post autor: Grzegorz Winiarski »

Wstaw to zamiast fwrite() w skrypcie.
[php]<?php
foreach($content as $c) {
fwrite($handle, $c.'\n');
}

?>[/php]

templar_of_steel: nie powinno być join() bo chcemy miec kazda linijke osobno.
Wojciech Kocjan
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: sob gru 14, 2002 10:51 am

Re: [php] zapis do okreslonej lini

Post autor: Wojciech Kocjan »

MiChaSSs pisze:robilem tak jak Ty Wojtek ale niestety zapisuje sie "Array" :(
Templar ma racje, brakuje tutaj join(), zrob cos takiego:

[php]<?php
fwrite($handle,trim(implode("\n",$content)));
?>[/php]
MiChaSSs
Posty: 18
Rejestracja: czw cze 10, 2004 11:14 pm

Re: [php] zapis do okreslonej lini

Post autor: MiChaSSs »

niestety, i kod Grzegorza i Wojtka zapisują "Nową linie 60" w lini 1 ;(
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php] zapis do okreslonej lini

Post autor: viraptor »

Wiec moze wyjasnie sprawe - kod ktory wypisuje Array robi tak oczywiscie, bo probujesz wypisac tablice funkcja do stringow. Taka zwraca wtedy Array.
A foreach nie dziala z tego powodu:
[php]<?php
$content[2]='Nowa linia 2';
$content[0]='\n';
$content[1]='\n';
vardump($content);
?>[/php]
zwraca:

Kod: Zaznacz cały

array(3) { [2]=>  string(12) "Nowa linia 2" [0]=>  string(2) "\n" [1]=>  string(2) "\n" }
i juz widac dlaczego nowa linia [2] laduje w pierwszej linii.
Teraz kod dzialajacy (mozna go zoptymalizowac, ale leniwy jestem:
[php]<?php
$fileName='dane.txt';
$content=file($fileName);
$content[59]='Nowa linia 60'; // numerowane od zera
$handle=fopen($fileName,'w');

$linenr = -1; // bo numerowane od zera ;)
// dodajemy padding wartosci 0-60, bo mogly nie istniec
while (list($key, $val) = each($content)) {
$linenr++;
if($linenr < $key) {
while($linenr!=$key) {
$content[$linenr]="\n";
$linenr++;
}
}
}

$tekst = "";
// spisujemy tekst do 1 zmiennej i dodajemy \n tam gdzie nie ma
for($linenr=0; array_key_exists($linenr, $content); $linenr++) {
if(substr($content[$linenr], strlen($content[$linenr]) - 1, 1) != "\n") $content[$linenr] .= "\n";
$tekst .= $content[$linenr];
}
fwrite($handle,$tekst);
fclose($handle);
?>[/php]
Moznaby polaczyc te 2 petle, zeby to przyzwoicie wygladalo - zostawiam to waszej inwencji.

PS - wywali sie, jesli dodasz jakis klucz tekstowy, albo ujemny przez warunek w 11 linijce - mozna sprawdzac czy $key to numer, czy string.

[edit] Teraz zauwazylem - jesli poda sie linie nie w tej kolejnosci, to pierwsza petla nadpisze je (np. $content[2], a potem $content[1]) - zamiast $content[$linenr]="\n" powinno byc if($content[$linenr]=="") .....
MiChaSSs
Posty: 18
Rejestracja: czw cze 10, 2004 11:14 pm

Re: [php] zapis do okreslonej lini

Post autor: MiChaSSs »

wielkie dzięki !! chodzi !! :)
ODPOWIEDZ