Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

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;

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
70K
15 марта 2011 года
shaks
0 / / 15.03.2011
Мне нравитсяМне не нравится
15 марта 2011, 21:59:38
про пост ниже.. в нем $id+1 делать не нужно) очапатка моя :)
Код:
if(isset($file[$id+1]))

unset($file[$id+1]);

2.
70K
15 марта 2011 года
shaks
0 / / 15.03.2011
+6 / -0
Мне нравитсяМне не нравится
15 марта 2011, 21:57:45
Вот ты тут умничаешь типа.. \"Народ совсем не хочет шевелиться, ведь так легко зайти на любой... \" и т.д..
Я специально зарегистрировался, чтобы сказать автору статьи: \"Ты не особо разбираешься в теме!\"

Аргументирую.
1.
Код:
$file=file(\"file.txt\");



    for($i=0;$i<sizeof($file);$i++)

        if($i==$id) unset($file[$i]

Функция file возвращает упорядоченный массив, каждое значение которого == строке файла.
Как я понимаю то удалить нужно строку № $id
Теперь объясни мне, от зачем перебирать в цикле массив ???
Код:
if(isset($file[$id+1]))

unset($file[$id+1]);

..

2. А что если файлик весит 100 метров..или больше?.. ты все 100 метров будеш пыжиывать в переменную?

Ну и контрольный выстрел в голову:
Код:
for($i=0;$i<sizeof($file);$i++)

Зачем ты каждый раз вызываешь функцию sizeof() ? Зачем ты подситываешь кол-во элементов массива при каждом повторе цикла?
3.
43K
02 октября 2008 года
DontTouchMe
0 / / 02.10.2008
+4 / -1
Мне нравитсяМне не нравится
2 октября 2008, 00:42:58
Ага - легко просто и доступно... проблема только одна - если вы записываете строки в этот файл и удаляете из него - всё работает очень хорошо, пока вы не удалили последнюю строку... удалив последнюю строку следующая запишется через строку... и при следующем удалении этот скрипт ошибётся и удалит не ту строку. которую нужно.... Вот такой косяк...
4.
Аноним
Мне нравитсяМне не нравится
26 января 2006, 12:57:45
Насчет блокировки файла вдруг кому понадобиться.
Можно делать так, пишете сначала в какой-нить временый файл а потом его переимновываете(переносите) в нужный, это сработает т.к. операция переименовывания является атомарной ( то есть неделимой)
5.
Аноним
Мне нравитсяМне не нравится
17 ноября 2005, 02:49:03
А мне вот так нравица:
$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);
6.
Аноним
Мне нравитсяМне не нравится
18 октября 2005, 12:24:29
для перла написал, да -)
7.
Аноним
Мне нравитсяМне не нравится
18 октября 2005, 12:23:29
Раз ты все равно ищешь в каждой строке файле, то:
читаешь его построчно,
регулярным выражением находишь строки без Trumb.db,
кладешь такие строки в массив,
пишешь массив в файл. (<)
не забывая про блокировку файла на время записи.
8.
Аноним
Мне нравитсяМне не нравится
26 сентября 2005, 15:16:36
<blockquote><small>Цитата:<hr size=1>$fp=fopen("file.txt","w");
Эта строка затирает файл[/quote]

Ага, а следующая возвращает все содержимое обратно.
9.
Аноним
+0 / -1
Мне нравитсяМне не нравится
26 сентября 2005, 15:08:54
$fp=fopen("file.txt","w");
Эта строка затирает файл.
Ничего не работает.
Он просто сносит файл.:\
10.
Аноним
+1 / -1
Мне нравитсяМне не нравится
17 августа 2005, 12:27:25
есть файл в котором больше 100 строк...
как написать прогу, которая удаляет всю строку (если находит в ней заданное слово - Trumb.db).
строки идут в ряд...

Зараннее спасибо - если возможно - вышлите код на моё мыло.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог