Как удалить строку из файла с помощью PHP?
8 ответов
$contents = file_get_contents($dir);
$contents = str_replace($line, '', $contents);
file_put_contents($dir, $contents);
прочитайте строки одну за другой и запишите все, кроме соответствующей строки, в другой файл. Затем замените исходный файл.
это будет просто просматривать каждую строку, и если это не то, что вы хотите удалить, он будет отправлен в массив, который будет записан обратно в файл. посмотреть этот
$DELETE = "the_line_you_want_to_delete";
$data = file("./foo.txt");
$out = array();
foreach($data as $line) {
if(trim($line) != $DELETE) {
$out[] = $line;
}
}
$fp = fopen("./foo.txt", "w+");
flock($fp, LOCK_EX);
foreach($out as $line) {
fwrite($fp, $line);
}
flock($fp, LOCK_UN);
fclose($fp);
другой подход-читать файл строка за строкой, пока не найдете совпадение, затем усечь файл до этой точки, а затем добавить остальные строки.
это также хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.
код:
$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
$contents_array = preg_split("/\r\n|\r|\n/", $contents);
foreach ($contents_array as &$record) { // for each line
if (strpos($record, $id) !== false) { // if we have found the correct line
pass; // we've found the line to delete - so don't add it to the new contents.
}else{
$new_contents .= $record . "\r"; // not the correct line, so we keep it
}
}
file_put_contents($dir, $new_contents); // save the records to the file
echo json_encode("Successfully updated record!");
}
else{
echo json_encode("failed - user ID ". $id ." doesn't exist!");
}
пример:
вход: "123,студент"
файл:
ID, профессия
123,студента
124, слой кирпича
запуск кода изменит файл кому:
новый файл:
ID, профессия
124, слой кирпича
Это можно решить без использования awk:
function remove_line($file, $remove) {
$lines = file($file, FILE_IGNORE_NEW_LINES);
foreach($lines as $key => $line) {
if($line === $remove) unset($lines[$key]);
}
$data = implode(PHP_EOL, $lines);
file_put_contents($file, $data);
}
Я думаю, что лучший способ работы с файлами-редактировать их как строки.
во-первых, получить все строки файла (следующие коды могут быть сжаты):
$file = @fopen($dir, 'r'); # As you said, $dir is your filename
if ($file) { # Ending bracket is at the end
if (filesize($dir)) { # Checks whether the file size is not zero (we know file exists)
$fileContent = fread($file, filesize($dir)); # Reads all of the file
fclose($file);
} else {
// File is empty
exit; # Stops the execution (also you can throw an exception)
}
$fileLineByLine = explode(PHP_EOL, $fileContent); # Divides the file line by line
здесь вы можете выполнить поиск:
$key = false; # By default, your string $line is not in the file (false)
foreach ($fileLineByLine as $lineNumber => $thisLine)
if ($thisLine === $line)
$key = $lineNumber; # If $line found in file, set $key to this line number
просто, вы можете удалить строку $key + 1:
if ($key !== false) # If string $line found in the file
unset($fileLineByLine[$key]); # Remove line $key + 1 (e.g. $key = 2, line 3)
наконец, вы должны сохранить изменения в файл:
$newFileContent = implode(PHP_EOL, $fileLineByLine); # Joins the lines together
$file = fopen($dir, "w"); # Clears the file
if ($file) {
fwrite($file, $newFileContent); # Saves new content
fclose($file);
}
} # Ends 'if ($file) {' above
также вы можете установить выше код в качестве функции.
Примечания:
-
$строка не должна иметь новых символов строки, таких как \n. Вы должны удалить их:
$line = str_replace(PHP_EOL, '', $line);
-
Не используйте
$fileLineByLine[$key] = "";
вместо
unset($fileLineByLine[$key]);
потому что первый случай не удаляет строку, он просто очищает строку (и нежелательная пустая строка останется). В этом случае implode () добавляет новую строку также для $fileLineByLine[$key], которая пуста; в противном случае, если вы отключите переменную, она будет недоступна (и implode () не может найти его).