| |
автор: 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($fp, trim($arr));
fclose($fp);
}
?>
|
Приходят нормально, через echo проверял, удаляются по одному нормально(если в массиве 1 строка) хотя тоже чёто вроде глючит, а вот когда в массиве много строк, то глючит по страшному!!! Бывает так что весь текст в файле удваивается(но без какойто строки). | |
| |
|
|
| |
|
|
| |
для: 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 террабайт | |
| |
|
|
| |
|
|
| |
для: 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;
}
?> | |
| |
|
|
| |
|
|
| |
для: FaDer
(23.06.2006 в 13:31)
| | | $vars[1] кажется вовсе не массив | |
| |
|
|
| |
|
|
| |
для: FaDer
(23.06.2006 в 13:31)
| | |
$vars = $_POST['del'];
$vars = explode("|", $vars); //$vars[0] = Имя файла $vars[1] = номер строки
|
Это всё вовсе не правильно.. | |
| |
|
|
| |
|
|
| |
для: 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)
| | | Короче народ, всё элементарно:
НАДО УДАЛЯТЬ С КОНЦА!!! | |
| |
|
|
| |
|
|
| |
для: FaDer
(23.06.2006 в 22:42)
| | | Конструкция с использованием $stroka--; вам и мешает. | |
| |
|
|