PHP: удаление строки из файла
Я очень часто встречаю вопрос типа "Как удалить определенную строку из файла?". Народ совсем не хочет шевелиться, ведь так легко зайти на любой крупный форум по PHP, и в сроке поиска написать что-то типа "Удаление строк из файла". Пятерка результатов гарантирована. Итак, в первой части статьи мы как раз рассмотрим способ удаления определенной строки из текстового файла.
Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:
строка один строка два строка три строка четыре строка пять
Затем создаём что-нибудь типа file.php, занимающий около 11 строк!
<? if ($id != "") { $id--; $file=file("file.txt"); for($i=0;$i<sizeof($file);$i++) if($i==$id) unset($file[$i]); $fp=fopen("file.txt","w"); fputs($fp,implode("",$file)); fclose($fp); } ?>
Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором id: file.php?id=2 (удалим строку под номером ТРИ, так как исчисления элементов в массиве ведётся с нуля, но позже мы это сгладим).
- функция file() считывает весь файл в массив (каждая строка - это его элемент);
- $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 - 3;
- unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуально:);
- implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array;
Оставить комментарий
Комментарии
unset($file[$id+1]);
Я специально зарегистрировался, чтобы сказать автору статьи: \"Ты не особо разбираешься в теме!\"
Аргументирую.
1.
for($i=0;$i<sizeof($file);$i++)
if($i==$id) unset($file[$i]
Функция file возвращает упорядоченный массив, каждое значение которого == строке файла.
Как я понимаю то удалить нужно строку № $id
Теперь объясни мне, от зачем перебирать в цикле массив ???
unset($file[$id+1]);
..
2. А что если файлик весит 100 метров..или больше?.. ты все 100 метров будеш пыжиывать в переменную?
Ну и контрольный выстрел в голову:
Зачем ты каждый раз вызываешь функцию sizeof() ? Зачем ты подситываешь кол-во элементов массива при каждом повторе цикла?
Можно делать так, пишете сначала в какой-нить временый файл а потом его переимновываете(переносите) в нужный, это сработает т.к. операция переименовывания является атомарной ( то есть неделимой)
$file=file("file.txt");
foreach($file as $k=>$v)
if (!stristr($v,"Trumb.db"))
$nfile[]=$v;
$file=fopen("file.txt","w");
fwrite($file,implode($nfile,"\n"));
fclose($file);
читаешь его построчно,
регулярным выражением находишь строки без Trumb.db,
кладешь такие строки в массив,
пишешь массив в файл. (<)
не забывая про блокировку файла на время записи.
Эта строка затирает файл[/quote]
Ага, а следующая возвращает все содержимое обратно.
Эта строка затирает файл.
Ничего не работает.
Он просто сносит файл.:\
как написать прогу, которая удаляет всю строку (если находит в ней заданное слово - Trumb.db).
строки идут в ряд...
Зараннее спасибо - если возможно - вышлите код на моё мыло.