PHP — Удаление строки из файла под номером

221
03 января 2018, 20:28

Написал функцию, пытаюсь передать номер строки которую нужно удалить. По итогу ничего не получается и строка не удаляется. Справа стоят 777.

function DeleteLine($line) {
    $fopen=file($this->files);
    unset($fopen[$line]);
    $f=fopen($this->files, "w+");
    foreach($fopen as $string) { 
        fwrite($f, $string); 
    }
    fclose($f);
    return true;
}
Answer 1
$strNum = 1;
$result = "";
$delLine = 2;
$fp = fopen("test.txt", "r");
while (!feof($fp)) {
    $line = fgets($fp);
    if ($strNum != $delLine) $result .= $line;
    $strNum++;
}
fclose($fp);
$fw = fopen("test.txt", "w");
fwrite($fw, $result);
fclose($fw);

Еще вариант:

$file = preg_split("/\n/", file_get_contents("test.txt"));
unset($file[2]);
$fw = fopen("test.txt", "w");
foreach ($file as $str){
    fwrite($fw, $str."\n");
}
fclose($fw);
Answer 2

Не большое замечание: так как в результате чтения файла, функция file() возвращает массив, элементы которого начинаются с нуля, то при попытке удаления первой строки DeleteLine(1) будет удалена вторая строка. В остальном же, код должен работать (у меня на локалке он работает) Посмотрите, что приходит в свойство $this->files - скорее всего только в этом и есть проблема.

Следующее, что не мешало бы подкорректировать, так это результат, возвращаемый функцией (у вас результат всегда true, даже если ничего не было удалено). Ну и конечно, не помешает проверка на существование удаляемого элемента. С учётом этих замечаний код будет иметь такой вид:

var_dump(DeleteLine(2));
// Функция возвращает строку, которая была удалена, или false

function DeleteLine($line) {
    $delete_string = false;
    $lines = file($this->files, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (isset($lines[--$line])) {
        $delete_string = $lines[$line];
        unset($lines[$line]);
        $f = fopen($this->files, 'w+');
        foreach ($lines as $string) {
            fwrite($f, $string); 
        }
        fclose($f);
    }
    return $delete_string;
}
Answer 3

Ваша функция рабочая, но я бы добавил проверку на существование файла:

function DeleteLine($line){
    if (file_exists($this->files)){
        $fopen = file($this->files);
        unset($fopen[$line]);
        $f = fopen($this->files, "w+");
        foreach($fopen as $string) {
            fwrite($f, $string);
        }
        fclose($f);
        return true;
    } else {
        return false;
    }
}

Далее смотрите, что возвращается true или false. Если false, значит проблема с $this->files

READ ALSO
Структура laravel на примере интернет-магазина

Структура laravel на примере интернет-магазина

Изучаю LaravelХочется понять структуру валидации данных

285
Как вызвать аяксом функцию внутри РНР-класса с запрещённым прямым доступом

Как вызвать аяксом функцию внутри РНР-класса с запрещённым прямым доступом

Есть РНР-файл с классом и функцией внутри класса, который подключается к файлу с главным классом:

213
Как добавить нужно условие MySQL?

Как добавить нужно условие MySQL?

Есть поиск на сайте по тегам:

200