Подскажите как удалить определённую строку..

1. 3DwEp (31.10.2009 / 17:53)
всем привет.. Пожалуйста подскажите как сделать удаление строки из файла с определённым id'ом?
Допустим мне нужно удалить 2'ую строку с id'ом 2 из файла uz.dat
Файл uz.dat
|1|SinglE|100|3|on|
|2|NeO|100|1|on|
|3|НЕ0БЫЧНЫЙ|100|1|on|
За id отвечает 1ая ячейка...
Заранее спасибо smile

2. Вантуз-мен (31.10.2009 / 18:10)
//------------------- Функция удаления строк(и) из файла --------------------//
function delete_lines($files, $lines){
if ($lines!==""){
if (file_exists($files)){
if(!is_array($lines)){
$file=file($files);
$fp=fopen($files,"a+");
flock ($fp,LOCK_EX);
ftruncate ($fp,0);
if (isset($file[$lines])){unset($file[$lines]);}
fputs ($fp, implode($file));
fflush($fp);
flock ($fp,LOCK_UN);
fclose($fp); 
unset ($lines);
} else {
$file=file($files);
$fp=fopen($files,"a+");
flock ($fp,LOCK_EX);
ftruncate ($fp,0);
foreach($lines as $val){ 
if (isset($file[$val])){unset($file[$val]);}
}
fputs ($fp, implode($file));
fflush($fp);
flock ($fp,LOCK_UN);
fclose($fp); 
unset ($lines);
}}}
}


3. Вантуз-мен (31.10.2009 / 18:11)
//------------------ Функция проверки ячейки строки в файле ------------------//
function search_string($file, $str, $ceil) {   
if (file_exists($file)){
$files = file($file);
foreach($files as $key=>$value){
$data = explode("|", $value);
if ($data[$ceil]==$str){
$data['line'] = $key;
return $data; break;
}}}
return false;
}


4. Вантуз-мен (31.10.2009 / 18:15)
делаешь так
$string = search_string("uz.dat", $number, 1); // где number это какую нужно найти строку то есть id, а единичка тут номер ячейки, так как у тебя идет |2| то есть первая ячейка
if ($string) { // если такая строка есть
delete_lines("suz.dat", $string['line']);
}
$string возвращает из функции все строку поделенную на массив и строковой ключ LINE означающий номер строки в файле вот его и удаляем


5. 3DwEp (31.10.2009 / 18:16)
Vantuz, спасибо огромное.. Пошёл разбиратьсяsmile

6. Titov (31.10.2009 / 18:17)
<?php
$id = $_GET['id'];
$var='0';
$file=file ('uz.dat');
$count=count($file);
for($i=0;$i<$count;$i++)
{
$ex=explode('|',$file[$i]);
if ($ex[1]==$id)
{
$string=str_replace($file[$i],'',file_get_contents("uz.dat"));
$fopen=fopen("uz.dat","w");
fputs($fopen,$string);
fclose($fopen);
$var='1';
}
}
if (!empty($var)) {
echo'Юзер удален!<br/>'; } else {
echo'Юзер не удален!<br/>'; } 
}
?>


7. 3DwEp (31.10.2009 / 18:19)
6, и тебе спасибо.. E

8. 3DwEp (31.10.2009 / 18:27)
6, почемуто твоим способом очищает весь файл

9. 3DwEp (31.10.2009 / 18:32)
Спасибо SNELS'у.. Его способ помогsmile

10. Вантуз-мен (31.10.2009 / 18:55)
пользуйся лучше моими функциями,их можно множество раз использовать
$string = search_string("uz.dat", $number, 1);
if ($string) {
delete_lines("suz.dat", $string['line']);
}
код очень короткий, у меня открывается в мягком режиме a+ все проверки и блокировки

11. Вантуз-мен (31.10.2009 / 18:57)
к тому же в функции delete_lines можно удалять строки по одной если номер известен и сразу несколько к примеру delete_lines('uz.dat', array(0,6,14));

12. ramzes (01.11.2009 / 00:52)
Лучше бы обьяснилиsmile
1. Открыл файл по строчно, получил массив строк (file())
2. Удалил из полученого массива нужную тебе сроку, (unset())
2. Записал файл по новой (смотри код вантуза, (или fwrite()) )

13. Дмитрий (23.12.2009 / 17:46)
Поднимаю тему по причине актуальности.
Подскажите на свежую голову:
Мне нужно сделать проверку наличия ячейки в одной из строк файла, и если ячейка не найдена, то выдать ошибку.
Обычно я делаю так:
$file=file($sitedatafile); 
$total = count($file);
for($i=0; $i<$total; $i++){
$data = explode('|',$file[$i]);
if($data[3]==$msnum){
ВЫПОЛНЯЕТСЯ СКРИПТ
} else {echo' Такого номера изображения не существует'; exit;}}
// $sitedatafile - файл, где выполняется поиск
// $msnum - содержимое ячейки, которое нужно найти
Или второй вариант
$string = search_string($sitedatafile, $msnum, 10);
if ($string) {
ВЫПОЛНЯЕТСЯ СКРИПТ
} else {echo' Такого номера изображения не существует'; exit;}
// переменные те же
Обычно использую один из этих вариантов,
сейчаз чего-то в первом случае работает только с первой строкой (остальные не ищет),
во втором случае вообще ничего не отображает сразу после if ($string) {
Подскажите!

14. ramzes (23.12.2009 / 18:51)
$file = file('text.txt');
foreach($file as $id=>$line){
$data = explode('|',$line);
if($data[3]==$searchVar){
$result = $id;
}}
if(isset($result)){
echo' result in '.$result.' line';
}
типа того можно.
В твоем первом варианте неверно то что в случае если в первой строке нет совпадения то ты останавливаешь скрипт. Надо просто продолжать цикл до конца а у тебя ехит; стоит.

15. Дмитрий (24.12.2009 / 01:19)
Спасибо, sanzstez помог

16. Саня (24.12.2009 / 01:31)
Незачто, обращайся )

17. Дмитрий (11.08.2010 / 08:12)
Vantuz (31 Октября 2009 / 17:57)
пользуйся лучше моими функциями,их можно множество раз использовать
$string = search_string("uz.dat", $number, 1);
if ($string) {
delete_lines("suz.dat", $string['line']);
}
код очень короткий, у меня открывается в мягком режиме a+ все проверки и блокировки.

К тому же в функции delete_lines можно удалять строки по одной если номер известен и сразу несколько к примеру delete_lines('uz.dat', array(0,6,14));

Саня, посоветуй, как мне выбрать из файла все строки с одинаковым значением определенной ячейки (например, ячейка 0 - имя юзера) и удалить их? Я так понимаю, delete_lines не подойдет, т.к. я не знаю номера строк?

18. Вантуз-мен (11.08.2010 / 11:54)
сперва в цикле пройдись запиши в массив номер строк где встречается совпадение, а потом уж delete_lines и передай массив

URL: https://visavi.net/topics/2281