[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление нескольких строк разом
LRCenter
Есть функция для удаления текстовой строки из файла.

PHP
function delinfo ($id$filecont) {
    
$file=file($filecont);
    
$fp=fopen($filecont,"w");
    
flock ($fp,LOCK_EX);
    for (
$i=0;$isizeof($file);$i++) { if ($i==$id) {unset($file[$i]);} }
    
fputs($fpimplode("",$file));
    
flock ($fp,LOCK_UN);
    
fclose($fp);
    @
chmod("$filecont"0644);
}



Работает замечательно. Но удаляет только одну строку за раз.

И есть массив произвольных переменных (в них номера строк) $form[$i], считанных с формы.

Как мне усовершенствовать функцию что-бы она принимала в качестве первой переменной массив $form[$i], и удаляла несколько строк разом, без смещения?

Куда приделать цикл?




Спустя 2 часа, 59 минут, 55 секунд (26.03.2009 - 17:42) modobaks написал(а):
самый простой вариант

PHP
$a = array( 14);
foreach( 
$a as $v )
{
delinfo $v,  $filecont );
}

Спустя 19 минут, 26 секунд (26.03.2009 - 18:01) LRCenter написал(а):
Спасибо. А не подскажите как превратить $area[$i] в array(n1, n2, ..nn)?
А то я в массивах не очень силен


Мне кажется если функцию пускать по циклу то будет происходить смещение строк... т.е если, например, строку n3 удалили то при перзаписи файла все последующие строки изменят свой номер - т.е. уменьшаться на 1. Например n7 станет n6 и т.д.

так что цикл нужно вносить внутрь функции

Спустя 12 часов, 57 минут, 49 секунд (27.03.2009 - 06:59) LRCenter написал(а):
Так и происходит - если пустить функцию по циклу то строки удаляются со смещением sad.gif

Цикл надо ввести в функцию до перезаписи файла - только не врубаюсь куда конкретно

Спустя 29 минут, 30 секунд (27.03.2009 - 07:29) kirik написал(а):
Цитата (LRCenter @ 26.03.2009 - 22:59)
строки удаляются со смещением

Если я правильно понял задачу, то следующий код подойдет.

PHP
$filename 'test.txt'// файл
$delete = array(025); // номера строк, которые удаляем


$file file($filenameFILE_IGNORE_NEW_LINES);
while(list(
$line$data) = each($file))
{
    if(
in_array($line$delete))
        
$file[$line] = null;
}
file_put_contents($filenameimplode("\n"$file), LOCK_EX);
unset(
$file);

Спустя 37 минут, 31 секунда (27.03.2009 - 08:06) LRCenter написал(а):
а где же сама функция file_put_contents?

Спустя 7 минут, 4 секунды (27.03.2009 - 08:13) kirik написал(а):
Тут (php5) smile.gif

Спустя 9 минут, 29 секунд (27.03.2009 - 08:23) LRCenter написал(а):
упс... а у меня 4-ка...

Спустя 1 час, 28 минут, 22 секунды (27.03.2009 - 09:51) kirik написал(а):
Цитата (LRCenter @ 27.03.2009 - 00:23)
упс... а у меня 4-ка...

Ну махни просто на fwrite, как у тебя сделано..

Спустя 11 минут, 32 секунды (27.03.2009 - 10:02) LRCenter написал(а):
да, я переустановил php - поставил 5-ку. Давно хотел это сделать.
А не подскажете как вписать массив переменных вида $form[$i] в этот код вместо array(0, 2, 5)?

Спустя 7 минут, 37 секунд (27.03.2009 - 10:10) kirik написал(а):
Цитата (LRCenter @ 27.03.2009 - 02:02)
А не подскажете как вписать массив переменных вида $form[$i] в этот код вместо array(0, 2, 5)?

Типа из формы значения принять?

Вот так, если в каждом поле по значению
HTML
<form method="post" action="script.php">
<input size="2" name="line[]" />
<input size="2" name="line[]" />
<input size="2" name="line[]" />
<input size="2" name="line[]" />
.....
</form>

а в пхп принимаешь
PHP
//.......
$delete $_POST['line'];
//.......


или так если значения строк будут задаваться через запятую:
HTML
<form method="post" action="script.php">
<input size="2" name="lines" />
.....
</form>

и php к этому:
PHP
$delete = array();
$lines explode(','$_POST['lines']);
for(
$i 0$c count($lines); $i $c$i++)
{
    
$line_value trim($lines[$i]);
    if(!empty(
$line_value))
        
$delete[] = $line_value;
}
unset(
$lines);


Спустя 4 часа, 53 минуты, 26 секунд (27.03.2009 - 15:04) LRCenter написал(а):
Спасибо! Все работает супер!
Только вот сторка очищается, а как можно удалить ее полностью, т.е. чтоб вместо нее не оставалось пустой строки?

Спустя 4 часа, 41 минута, 23 секунды (27.03.2009 - 19:45) kirik написал(а):
Цитата (LRCenter @ 27.03.2009 - 07:04)
а как можно удалить ее полностью, т.е. чтоб вместо нее не оставалось пустой строки?

ээм.. мне кажется задача была
Цитата (LRCenter @ 26.03.2009 - 22:59)
если пустить функцию по циклу то строки удаляются со смещением

тоесть удалять строки без смещения? Или нет?
В любом случае:

PHP
$filename 'test.txt'// файл
$delete = array(025); // номера строк, которые удаляем


$file file($filenameFILE_IGNORE_NEW_LINES);
while(list(
$line$data) = each($file))
{
    if(
in_array($line$delete))
        unset(
$file[$line]);
}
$file array_filter($file);
file_put_contents($filenameimplode("\n"$file), LOCK_EX);
unset(
$file);

Спустя 25 минут, 36 секунд (27.03.2009 - 20:11) LRCenter написал(а):
Да, я не очень точно выразился.
Вот это оно!!!
kirik, спасибо вам огромное!

Спустя 13 минут, 25 секунд (27.03.2009 - 20:24) kirik написал(а):
Цитата (LRCenter @ 27.03.2009 - 12:11)
спасибо вам огромное!

5 баксов wink.gif

Спустя 50 минут, 13 секунд (27.03.2009 - 21:14) sergeiss написал(а):
Цитата (kirik @ 27.03.2009 - 20:24)
Цитата (LRCenter @ 27.03.2009 - 12:11)
спасибо вам огромное!

5 баксов wink.gif

biggrin.gif biggrin.gif biggrin.gif

Спустя 33 минуты, 46 секунд (27.03.2009 - 21:48) Viking написал(а):
давно пора к такой системе переходить smile.gif

Спустя 7 минут, 52 секунды (27.03.2009 - 21:56) sergeiss написал(а):
Цитата (Viking @ 27.03.2009 - 21:48)
давно пора к такой системе переходить smile.gif

Главное, чтобы не получилось, как в анекдоте.

Америка.
Мужик предлагает девушке сходить в кино. Она: "20 баксов!".
Мужик зовет ее в ресторан. Девушка: "30 баксов!"
Мужик: "Да пошла ты!!!". Девушка: "200 баксов!" smile.gif

А интересно... Если разместить в подписи номер Яндекс-кошелька... Это не будет как реклама воспринято? Или еще как-нибудь "не так"? wink.gif

Спустя 42 минуты, 31 секунда (27.03.2009 - 22:38) kirik написал(а):
Цитата (sergeiss @ 27.03.2009 - 13:56)
Мужик: "Да пошла ты!!!". Девушка: "200 баксов!"

biggrin.gif biggrin.gif

Цитата (sergeiss @ 27.03.2009 - 13:56)
Или еще как-нибудь "не так"?

smile.gif те кто не поймут - будут платить штраф.

Спустя 39 минут, 10 секунд (27.03.2009 - 23:17) sergeiss написал(а):
Ладно, провожу эксперимент...

Только я так и не понял, как в подписи сделать по-нормальному перевод строки.

Спустя 16 минут, 21 секунда (27.03.2009 - 23:34) twin написал(а):
Ух ты! Тож хочу.

Спустя 34 минуты, 31 секунда (28.03.2009 - 00:08) sergeiss написал(а):
Цитата (twin @ 27.03.2009 - 23:34)
Ух ты! Тож хочу.

И почему просто "хочешь"? Возьми, да сделай smile.gif Алгоритм простой. Проще, чем сделать простейшую гостевую книгу smile.gif

Спустя 28 минут, 20 секунд (28.03.2009 - 00:37) twin написал(а):
Уже biggrin.gif

Спустя 1 час, 3 минуты, 8 секунд (28.03.2009 - 01:40) kirik написал(а):
Какие вы все-таки! cool.gif

Спустя 5 часов, 29 минут, 2 секунды (28.03.2009 - 07:09) LRCenter написал(а):
smile.gif smile.gif smile.gif
Кризис, да?

Кстати, насчет кошелька идея хорошая. Почему-бы не заплатить, хотя-бы символически, человеку за потраченное время?

kirik, какой у вас № яндекс денег или вебмани?

Спустя 10 минут, 35 секунд (28.03.2009 - 07:19) LRCenter написал(а):
Лучьше, конечно яндекс деньги.

Спустя 19 минут, 13 секунд (28.03.2009 - 07:39) kirik написал(а):
Да не стоило smile.gif Но раз уж пошла такая пьянка, зарегистрировал только что ЯД, сказали номер счета - 41001364688166

Спустя 30 минут, 16 секунд (28.03.2009 - 08:09) Sylex написал(а):
я давно уже хочу отвечать на "спасибо" № ядов smile.gif

Спустя 6 минут, 22 секунды (28.03.2009 - 08:15) LRCenter написал(а):
kirik, вот. Спасибо еще раз за ваше терпение и полноту ответа. laugh.gif

Спустя 2 минуты, 8 секунд (28.03.2009 - 08:17) kirik написал(а):
Цитата (Sylex @ 28.03.2009 - 00:09)
я давно уже хочу отвечать на "спасибо" № ядов

Sylex, тут темка есть.. Волшебный кошелек называется, размести у себя в подписи свой кошелек, и 4 кошелька других форумчан! Эта штука реально работает! tongue.gif

зы. чувствую теперь будут битвы за право отвечать smile.gif Одно обидно что не все такие благодарные dry.gif

Спустя 4 минуты, 24 секунды (28.03.2009 - 08:22) kirik написал(а):
Цитата (LRCenter @ 28.03.2009 - 00:15)
kirik, вот. Спасибо еще раз за ваше терпение и полноту ответа.

это не 5 баксов! mad.gif
Сучу smile.gif А чего так много? Спасибо!
Это первые деньги которые пришли на этот кошелек. Можно желание загадывать rolleyes.gif /* еще столькоже*10 в 12-й степени... dry.gif..не.. в 15-й */

Спустя 3 часа, 8 минут, 39 секунд (28.03.2009 - 11:30) twin написал(а):
Надо бы десятину установить в фонд форума...

Спустя 8 часов, 15 минут, 3 секунды (28.03.2009 - 19:45) kirik написал(а):
Цитата (twin @ 28.03.2009 - 03:30)
Надо бы десятину установить в фонд форума...

Я не против десятины, главное чтобы рекламы небыло тут smile.gif

Спустя 4 часа, 39 минут, 37 секунд (29.03.2009 - 00:25) sergeiss написал(а):
Цитата (kirik @ 28.03.2009 - 19:45)
Цитата (twin @ 28.03.2009 - 03:30)
Надо бы десятину установить в фонд форума...

Я не против десятины, главное чтобы рекламы небыло тут smile.gif

Вообще-то, это противоречит пожеланиям администрации форума wink.gif http://phpforum.ru/index.php?showtopic=3&hl=

Спустя 5 часов, 43 минуты (29.03.2009 - 05:08) kirik написал(а):
Цитата (sergeiss @ 28.03.2009 - 16:25)
Вообще-то, это противоречит пожеланиям администрации форума

Блин, только подумал.. smile.gif


_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.