Удалить из файла несколько строк

NeonLost

есть форма, примерно такого вида...
<form action="action.php" method="post">
 
<input type="checkbox" name="type[]" value=0 />2013-03-22 18:07:35: ffffffffffffffff
<br><input type="checkbox" name="type[]" value=1 />2013-03-22 18:07:44: ccccccccccccccccccc
<br><input type="checkbox" name="type[]" value=2 />2013-03-22 18:14:58: xxxxxxx
<br><br><input type="submit" value="Delete" />
 </form>
есть такой код...
$data_file = file("1.txt"); //Считываем файл в массив
$f=fopen("1.txt","w"); //Открываем для записи
flock ($f,LOCK_EX); //Блокируем во избежание ошибок одновременного доступа
ftruncate ($f,0); //Вычищаем содержимое файла
for($i=0;$i<sizeof($data_file);$i++){
if(isset($_POST['type'][$i])){ //Если мы получили переменную, то
continue; //нифига не делаем просто идем дальше
}
else { //А если нет, пишем строку в файл
fputs($f,$data_file[$i]);
}
}
flock ($f,LOCK_UN); //Снимаем блокировку
fflush($f); //Вычищаем файловый буфер
fclose($f); //Закрываем файл
unset($data_file); //Сносим массив
но этот код удаляет самые первые строки, их количество зависет от ппоставленных галачек, как можно подправить, чтоб удаляло нужные строки?..)ну в общем, решил немного другой подход взять...вдруг кому понадобится...)
$deleteStringNum = array();
for($i=0;$i<count($_POST['type']);$i++)
{
    if(isset($_POST['type'][$i]))
    {
        array_push($deleteStringNum, $_POST['type'][$i]);
    }
}
foreach($deleteStringNum as $key => $value)
{
    delinfo($value, "1.txt");
}
<?
function delinfo ($id, $filecont)
{
 
        $file=file($filecont);
        $fp=fopen($filecont,"w");
        flock ($fp,LOCK_EX);
        for ($i=0;$i< sizeof($file);$i++) { if ($i==$id) {unset($file[$i]);} }
        fputs($fp, implode("",$file));
        flock ($fp,LOCK_UN);
        fclose($fp);
        @chmod("$filecont", 0644);
}
?>
только тут не работает удаление нескольких строк...(
3 ответа

NeonLost

Печаль....


NeonLost

так как после каждого вызова функции, удаляющей строку по номеру, шло смещение удаляемых строк вверх на еденичку, пришлось сделать так, но тоже не работает...прошу помощи...)
$deleteStringNum = array();
for($i=0;$i<count($_POST['type']);$i++)
{
    if(isset($_POST['type'][$i]))
    {
        array_push($deleteStringNum, $_POST['type'][$i]);
    }
}
for($i=0; $i<count($deleteStringNum); $i++)
{
    delinfo($deleteStringNum[$i], $filename);
    foreach($deleteStringNum as $val)
    {
        $val--;
    }
}
еще раз переделал, теперь точно работает...)
$deleteStringNum = array();
for($i=0;$i<count($_POST['type']);$i++)
{
    if(isset($_POST['type'][$i]))
    {
        array_push($deleteStringNum, (int)$_POST['type'][$i]);
    }
}
$iterCount=0;
for($i=0; $i<(int)count($deleteStringNum); $i++)
{
    delinfo($deleteStringNum[$i]-$iterCount, $filename);
    $iterCount++;
}
велосипеды...)


NeonLost

зачем лишний массив, цикл и переменная?
for( $i = 0, $cnt = count($_POST['type']); $i < $cnt; $i++ )
{
    if( isset($_POST['type'][$i]) )
    {
        delinfo( intval($_POST['type'][$i]) - $i, $filename );
    }
}