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

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);
    }

Сдается мне, что я написал этот алгоритм через задницу, есть ли проще алгоритм (не приводите его, просто скажите на какие функции внимание обратить).
Спасибо.
 
функции на которые ты обратил внимание верны, но алгоритм очень далек от оптимального :)
Если очень сильно не задумываться (все равно оптимальнее получится :)), можно сделать так например:
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);
}
 
Сдается мне, что я написал этот алгоритм через задницу,
Определенно....

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

А вообще смотря на алгоритм вспомнил анекдот что если бы программисты строили дома, то первый залетевший скворец разрушил бы цивилизацию.
 
Если файл большой, то нужно читать файл по строкам, и писать в другой(!) новый файл тоже по строкам, при этом нужно оба файла залочить перед этой операцией, а после неё нужно просто переименовать оба файла, первый, из которого читали в бэкап, а второй в первый.
 
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?
 
Тут еще одна засада - записывать в файл естественно будет быстрее разом, чем по чайной ложке.
А вообще, тема оптимизации неисчерпаема.
 
...но если файл большой (больше memory limit), то весь сразу не прочитаешь. да и поиск-удаление нужной подстроки в строке длиной в десяток метров весьма небыстр...
по идее, нужна буферизация ввода-вывода...
 
для больших файлов (и не только) придумали fseek()/ftell()
изволю повториться. Или вы думаете что первые базы данных при удалении строки (записи) из таблицы (файла) перечитывали всю базу??? :)
 
в первых базах данных каждая запись занимала одно и то же число байт, и не удалялось вообще ничего - просто запись помечалась как удаленная, а потом поверх неё писалась другая. :)

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

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