Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как удалить строку из файла


Автор: DezmASter 26.4.2007, 13:15
Я очень часто встречаю вопрос типа "Как удалить определенную строку из файла?". Народ совсем не хочет шевелиться, ведь так легко зайти на любой крупный форум по PHP, и в сроке поиска написать что-то типа "Удаление строк из файла". Пятерка результатов гарантирована. Итак, в первой части статьи мы как раз рассмотрим способ удаления определенной строки из текстового файла.

Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:

строка один
строка два
строка три
строка четыре
строка пять

Затем создаём что-нибудь типа file.php, занимающий около 11 строк!

Код

<?
if ($id != "")
{
$id--;
$file=file("file.txt"); 
$fp=fopen("file.txt","w"); 
for($i=0;$i<sizeof($file);$i++)
{ 
if($i==$id)
{ 
unset($file[$i]); 
} 
} 
fputs($fp,implode("",$file)); 
fclose($fp);
}
?>


Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором id: file.php?id=2 (удалим строку под номером ТРИ, так как исчисления элементов в массиве ведётся с нуля, но позже мы это сгладим).

- функция file() считывает весь файл в массив (каждая строка - это его элемент);
- $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 - 3;
- unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуальноsmile;
- implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array...

Автор: Mike Khoroshun
Сайт автора: не работает.

Автор: ksnk 26.4.2007, 14:50
Угу... Особенно полезна эта функция для выкидывания каких-нибудь записей из log-файла, занимающего более 8 мб, при стандартных настройках сервера.

Автор: Всемогущий 26.4.2007, 20:40
Код

<?php

$delstr=1;//номер строки для удаления
$oldfile='oldfile.txt';//имя старого файла
$mytemp=tempnam("/tmp", "kkk");
$today = date("m.d.Y_H.i.s");
if($handleold = @fopen($oldfile,'rb')){
echo 'старый файл существует<br>';
if($handlenew = fopen($mytemp,'w'))echo 'нормально создался новый файл';}else die('старый файл несуществует');

while (!feof($handleold)) {
    $buffer = fgets($handleold);
    if($delstr!=(++$i))fwrite ($handlenew,$buffer);
}
fclose($handleold);
fclose($handlenew);

if(rename($oldfile,'backup '.$today.'-'.$oldfile)){
if(rename ($mytemp,$oldfile)) echo '<br>ok';}

?>


Цитата(changelog)

---------27.4.2007
Цитата(ksnk @  27.4.2007,  01:06 Найти цитируемый пост)
исправить ошибку, из-за которой скрипт второй раз работать откажется.

профиксил.
---------

Автор: ksnk 26.4.2007, 23:06
Всемогущий, 
почти нормально, можно добавить только flock, для приличия, и исправить ошибку, из-за которой скрипт второй раз работать откажется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)