Функция удаления строки из файла

Alkeeper

Новичок
Функция удаления строки из файла

Сабж, в функцию из формы передается номер строки на удаление - $_POST["del"]
PHP:
function udal()
	{
    global $db;
	$input = file($db);
	$input = array_reverse($input);
	$ic = sizeof($input);
    $del2 = $_POST["del"] + 1;
	$top_arr = array_slice ($input, 0, $_POST["del"]);
    $bot_arr = array_slice ($input, $del2);
	if ($_POST["del"] == 0) $all_after = array_slice($input, 1);
	else $all_after = array_merge($top_arr, $bot_arr);
    $tofile = array_reverse($all_after);
    $cnt = sizeof($tofile);
    $put = fopen($db, "w");
    for ($i = 0; $i < $cnt; $i++)
    	{
	    fwrite($put, $tofile[$i]);
    	}
  	fclose($put);
    }
Сдается мне, что я написал этот алгоритм через задницу, есть ли проще алгоритм (не приводите его, просто скажите на какие функции внимание обратить).
Спасибо.
 

Bloody

Guest
функции на которые ты обратил внимание верны, но алгоритм очень далек от оптимального :)
Если очень сильно не задумываться (все равно оптимальнее получится :)), можно сделать так например:
PHP:
function udal($num)
{
    global $db;
    $input=file($db);
    $f=fopen($db,"w");
    foreach($input as $nstr=>$str)
    {
        if($nstr==$num) continue;
        fwrite($f, $str);
    }
    fclose($f);
}
 

netdog

net @
Сдается мне, что я написал этот алгоритм через задницу,
Определенно....

ну если файл относительно маленький,то куда не шло, а вот файл хотябы в метров 10 и больше...
 

Yurik

/dev/null
для больших файлов (и не только) придумали fseek()/ftell()

А вообще смотря на алгоритм вспомнил анекдот что если бы программисты строили дома, то первый залетевший скворец разрушил бы цивилизацию.
 

Altex

Новичок
Если файл большой, то нужно читать файл по строкам, и писать в другой(!) новый файл тоже по строкам, при этом нужно оба файла залочить перед этой операцией, а после неё нужно просто переименовать оба файла, первый, из которого читали в бэкап, а второй в первый.
 

lucas

Guest
2Bloody

Не умнее (и быстрее) ли сделать так:

PHP:
function udal($num) 
{ 
    global $db; 
    $input=file($db);
    unset($input[$num - 1]) ;
    $f=fopen($db,"w");
    fwrite($f, implode("",$input));
    fclose($f); 
}
...а не страдать с перебором файла foreach?
 

Bloody

Guest
Да я ж говорю - сильно не задумывался... :)
 

Фанат

oncle terrible
Команда форума
Тут еще одна засада - записывать в файл естественно будет быстрее разом, чем по чайной ложке.
А вообще, тема оптимизации неисчерпаема.
 

fixxxer

К.О.
Партнер клуба
...но если файл большой (больше memory limit), то весь сразу не прочитаешь. да и поиск-удаление нужной подстроки в строке длиной в десяток метров весьма небыстр...
по идее, нужна буферизация ввода-вывода...
 

Yurik

/dev/null
для больших файлов (и не только) придумали fseek()/ftell()
изволю повториться. Или вы думаете что первые базы данных при удалении строки (записи) из таблицы (файла) перечитывали всю базу??? :)
 

fixxxer

К.О.
Партнер клуба
в первых базах данных каждая запись занимала одно и то же число байт, и не удалялось вообще ничего - просто запись помечалась как удаленная, а потом поверх неё писалась другая. :)

не в совсем первых были индексные файлы

а тут - простой текстовый файл...
 
Сверху