Я думаю, что лучший способ работы с файлами - это редактировать их как строки.
Сначала получите все строки файла (можно сжать следующие коды):
$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]);
, поскольку первый случай не 't удалить линию, она просто очищает линию (и нежелательная пустая строка останется).В этом случае implode () добавляет новую строку также для $ fileLineByLine [$ key], которая является пустой;в противном случае, если вы сбросите переменную, она будет недоступна (и implode () не сможет ее найти).