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]=="") .....