Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Удаление строк из Файла по массиву
 
 автор: FaDer   (22.06.2006 в 23:47)
 
 

Всё сдаюсь, думал пойму, а оказывается нет...
Как удалить строки в файле, если адреса строк приходят в массиве???
Выставляю массив:
<input type='checkbox' name='del[]' value=1>
<input type='checkbox' name='del[]' value=2>
<input type='checkbox' name='del[]' value=3>
В скрипте пишу:

<?php
foreach($_POST['del'] as $a) {   //Массив $_POST['del'], Приходят строки которые нужно удалить
  
$file file(file.txt); 
  for(
$i 0$i<count($file); $i++)
   {
    if(
$i != $a$arr.=$file[$i];
   }
  
$fp fopen(file.txt"w");
  
fputs($fptrim($arr));
  
fclose($fp);
}
?>

Приходят нормально, через echo проверял, удаляются по одному нормально(если в массиве 1 строка) хотя тоже чёто вроде глючит, а вот когда в массиве много строк, то глючит по страшному!!! Бывает так что весь текст в файле удваивается(но без какойто строки).

   
 
 автор: valenok   (23.06.2006 в 00:14)   письмо автору
 
   для: FaDer   (22.06.2006 в 23:47)
 


<?php 
$file 
file(file.txt); 
foreach(
$_POST['del'] as $a) {  unset($file[$a]); }
$file=implode("\r\n",$file);
$f=fopen('file.txt',"w");
fputs($f,$file);
fclose($f);
?>


Даже если сипрваить ваш код но оставить тот же принцип, для работы с файлами в 30 мб,
потребуется ОЗУ около 30 террабайт

   
 
 автор: cheops   (23.06.2006 в 11:59)   письмо автору
 
   для: FaDer   (22.06.2006 в 23:47)
 

Циклы поменяйте местами for - сделайте внешним, а foreach - внутренним.

   
 
 автор: FaDer   (23.06.2006 в 13:31)
 
   для: cheops   (23.06.2006 в 11:59)
 

Приходят 2 значения, разделённые "|" (Здесь обсуждал http://softtime.ru/forum/read.php?id_forum=4&id_theme=19652&page=1)
Ну так вот foreach не хочет работать, пишет:
Invalid argument supplied for foreach()
<?php
$vars = $_POST['del'];
$vars = explode("|", $vars); //$vars[0] = Имя файла $vars[1] = номер строки
foreach($vars[1] as $a)
{
echo $a;
}
?>

   
 
 автор: valenok   (23.06.2006 в 14:00)   письмо автору
 
   для: FaDer   (23.06.2006 в 13:31)
 

$vars[1] кажется вовсе не массив

   
 
 автор: valenok   (23.06.2006 в 14:02)   письмо автору
 
   для: FaDer   (23.06.2006 в 13:31)
 


$vars = $_POST['del']; 
$vars = explode("|", $vars); //$vars[0] = Имя файла $vars[1] = номер строки


Это всё вовсе не правильно..

   
 
 автор: valenok   (23.06.2006 в 14:05)   письмо автору
 
   для: FaDer   (23.06.2006 в 13:31)
 

Насколько я помню, вам нужно чтото такое:


<?php
$vars 
$_POST['del']; 
# $vars[0] -> "a1|b1" , $vars[1] -> "a2|b2" ..... // До сюда правильно я понимаю?
foreach($vars AS $str){
list(
$string,$file)= explode("|"$str);
... 
Тут удаление или ещё что...

?>

   
 
 автор: FaDer   (23.06.2006 в 14:55)
 
   для: valenok   (23.06.2006 в 14:05)
 

Спасибо большое.
Но вот другая проблема:
Скрипту передаются номера строк(через $_POST['del']), и Когда мы удаляем в цикле foreach строку, то нижние строки смещаются вверх, и когда доходит время до удаление другой стоки, то на месте её оказывается другая(не та которая нам нужна).
Можно вместо удалёной строки оставлять переход( \n), а не подымать вверх, но тогда будут сбои при работе скрипта чтения, так как 1 сообщение = 1 строка. Можно оставить переходы, а потом прочитать и вырезать их, но осложняет это, то что сообщения в разных файлах.
Так что делать???

   
 
 автор: FaDer   (23.06.2006 в 15:30)
 
   для: FaDer   (23.06.2006 в 14:55)
 

Я вот тут подумал, но чёто всёравно не пашет.
Массив передаётся по порядку(т.е. сначало в одном файле строки, а потом в другом), мы можем присвоить переменныую к файу, и потом сравнивать её с файлом, если они одинаковы, то из номера мы вычитаем еденицу.

<?php 
$vars 
$_POST['del']; 
foreach(
$vars as $str){ 
list(
$file$stroka)= explode("|"$str); 
if (
$file_tmp $file) {$stroka--;} //Проверяем
... Тут удаление или ещё что... 
$file_tmp $file// присваиваем

?>

Но вот почемуто не работает.

   
 
 автор: FaDer   (23.06.2006 в 18:41)
 
   для: FaDer   (23.06.2006 в 15:30)
 

,

   
 
 автор: FaDer   (23.06.2006 в 22:42)
 
   для: FaDer   (23.06.2006 в 18:41)
 

Короче народ, всё элементарно:
НАДО УДАЛЯТЬ С КОНЦА!!!

   
 
 автор: valenok   (24.06.2006 в 09:40)   письмо автору
 
   для: FaDer   (23.06.2006 в 22:42)
 

Конструкция с использованием $stroka--; вам и мешает.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования