PHP fwrite() как вставить новую строку после определенной строки

Я здесь впервые.
Во всяком случае, я изучил fwrite(), но не смог найти решения, поэтому прошу помощи. То, что я хочу, это f.e. чтобы добавить новую строку текста после какой-либо другой конкретной строки. Ф.э. У меня есть файл .txt, в котором есть:

//Users

//Other stuff

//Other stuff2  

Теперь я хотел бы иметь возможность добавить нового пользователя ниже //Пользователи, не касаясь «Другие материалы» и «Другие материалы 2». Так что это должно выглядеть примерно так:

//Users    
Aneszej  
Test321  
Test123

//Other stuff

//Other stuff2  

Что у меня есть до сих пор:

$config = 'test.txt';
$file=fopen($config,"r+") or exit("Unable to open file!");

$date = date("F j, Y");
$time = date("H:i:s");

$username = "user";
$password = "pass";
$email = "email";
$newuser = $username . " " . $password . " " . $email . " " . $date . " " . $time;

while (!feof($file)) {
    $line=fgets($file);
    if (strpos($line, '//Users')!==false) {
        $newline = PHP_EOL . $newuser;
    }

}

fwrite($file, $newline);

fclose($file);

файл test.txt

//Users

//Something Else

//Something Else 2

Но это только записывает пользователей в конец файла .txt.

Большое спасибо всем за вашу помощь! Это решено.


person Aneszej    schedule 16.05.2013    source источник
comment
Я думаю, что когда ваши манипуляции с файлами становятся немного сложными, вам следует использовать базу данных. Попробуйте SQLite, он вам идеально подходит...   -  person Henrique Barcelos    schedule 17.05.2013
comment
Это был просто пример, я собираюсь использовать его для чего-то другого. Спасибо за информацию.   -  person Aneszej    schedule 17.05.2013


Ответы (4)


Я изменил ваш код, я думаю, что вам нужно следующее, и я также добавил комментарий, функция ниже будет продолжать добавлять нового пользователя, вы можете добавить условие, которое проверяет существование пользователя.

$config = 'test.txt';
$file=fopen($config,"r+") or exit("Unable to open file!");

$date = date("F j, Y");
$time = date("H:i:s");

$username = "user";
$password = "pass";
$email = "email";
$newuser = $username . " " . $password . " " . $email . " " . $date . " " .    $time."\r\n";   // I added new line after new user
$insertPos=0;  // variable for saving //Users position
while (!feof($file)) {
    $line=fgets($file);
    if (strpos($line, '//Users')!==false) { 
        $insertPos=ftell($file);    // ftell will tell the position where the pointer moved, here is the new line after //Users.
        $newline =  $newuser;
    } else {
        $newline.=$line;   // append existing data with new data of user
    }
}

fseek($file,$insertPos);   // move pointer to the file position where we saved above 
fwrite($file, $newline);

fclose($file);
person Ming M Zheng    schedule 16.05.2013
comment
Спасибо большое работает исправно и именно так как я хотел! И спасибо за комментарий, что каждая вещь делает. - person Aneszej; 17.05.2013

Вы записываете новое содержимое в конце чтения, поэтому оно должно записываться в конец файла — курсор остается там после прочтения всех строк.

Либо вы сохраняете все содержимое в php-переменной и перезаписываете файл в конце, либо перематываете курсор с помощью fseek, как указано в комментарии Роберта Розаса. Это нужно сделать, как только вы прочтете строку «Что-то еще».

person flaschenpost    schedule 16.05.2013

Попробуйте fseek:

<?php
 $file = fopen($filename, "c");
 fseek($file, -3, SEEK_END);
 fwrite($file, "whatever you want to write");
 fclose($file);
?>

Документация по PHP: http://php.net/manual/en/function.fseek.php< /а>

person Hackerman    schedule 16.05.2013

Вам нужно break после того, как вы найдете '//Пользователи'. Вы продолжаете читать до конца файла.

person Markku K.    schedule 16.05.2013