PHP - чтение из плоского файла, удаление строки и запись обратно в плоский файл - PullRequest
0 голосов
/ 08 февраля 2012

Буду признателен за некоторую помощь

У меня есть текстовый файл со следующим содержимым:

1234|dog|apartment|two
1234|cat|apartment|one
1234|dog|house|two
1234|dog|apartment|three

Я хочу удалить запись, где животное является "собакой", живущей в "доме""

<?php
if (isset($_POST['delete_entry]))
{
    //identifies the file
    $file = "db.txt";
    //opens the file to read
    @$fpo = fopen($file, 'r');
    //while we have not reached the end of the file
    while(!feof($fpo))
    {
        //read each line of the file into an array called animal 
        $animal[] = fgets($fpo);
    }
    //close the file
    fclose($fpo);

    //iterate through the array
    foreach ($animal as $a)
    {
        if the string contains dog and apartment
        if ((stripos ($a, 'dog']))&&(stripos ($a, 'house')))
        {
            //dont do anything            
        }
        else
        {
            //otherwise print out the string
            echo $a.'<br/>';
        }
    }
}
?>

Это успешно распечатывает массив без записи, где появляются" собака "и" дом ".Мне нужно записать это обратно в плоский файл, но столкнуться с трудностями.

Я пробовал различные варианты, включая немедленную запись в файл при обнаружении каждой записи.

Warning: feof() expects parameter 1 to be resource, boolean given in 
Warning: fwrite(): 9 is not a valid stream resource in
Warning: fclose(): 9 is not a valid stream resource in 

Это ошибки, с которыми я столкнулся.Теперь, исходя из моего понимания массивов,
- когда я прохожу этот массив с именем animal,
- он проверяет индекс [0] для двух условий и
- если запись не найдена, он присваивается$ a.
- Затем он проходит через массив, начиная с индекса [1],
- и т. д.
Каждый раз, когда новое значение присваивается $ a.

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

Мне все еще нужно сделать бит, где мне нужно заменить «квартиру» на дом для одной специально выбранной записи, но я доберусь до нее, как только я разберусь «удалить»

Iмне не нужен код, может быть, просто логический поток, который может помочь мне.

Спасибо

Ответы [ 6 ]

1 голос
/ 08 февраля 2012

Чтобы сэкономить время, вы можете хранить ваши данные в массиве, только если они проходят ваши правила проверки при чтении из файла, и после прочтения конца файла у вас будет готов массив для записи обратно в файл.

1 голос
/ 08 февраля 2012

Как насчет шагов:

  • Прочитать файл.
  • Хранить содержимое файла в массиве.
  • Удалить элемент из массива.
  • Перезаписать файл новым содержимым.
0 голосов
/ 20 февраля 2012
  1. Считывание и выгрузка всех данных до тех пор, пока вы хотите удалить данные в $array_1.
  2. Считывание и выгрузка оставшейся части файла в $array_2.
  3. Объединение 2 массивов в$newarray, переписать на оригинальный плоский файл.

Простой!

0 голосов
/ 08 февраля 2012

Хотя это не отвечает на ваш первоначальный вопрос, я хотел бы поделиться тем, что я придумал.

Я почти уверен, что весь сценарий будет выполнен в три строки:

$file = file_get_contents( 'db.txt');
$result = preg_replace('/^\d+\|dog\|house\|\w+$/m', '', $file);
file_put_contents( 'db.txt', $result);

Использует регулярное выражение для замены строк на dog|house, затем записывает файл обратно.

0 голосов
/ 08 февраля 2012
<?php
    $fileName = 'db.txt';

    $data = @file($fileName);

    $id = 0;
    $animal = "";
    $type = "";
    $number = 0;

    $excludeAnimal = array("dog");
    $excludeHouseType = array("house");

    foreach($data as $row) {
        list($id,$animal,$type,$number) = explode("|",$row);
        if(in_array($animal,$excludeAnimal) && in_array($type,$excludeHouseType))
            continue
        /* ... code ... */
    }
?>
0 голосов
/ 08 февраля 2012

Что вы можете сделать, это открыть исходный файл в режиме чтения и временный файл в режиме записи. Когда вы читаете содержимое из файла «in», вы пишете строки в файл «out». Когда файл «in» обработан и закрыт, вы переименовываете «out» в «in». Таким образом, вам нужно меньше беспокоиться об ограничениях памяти.

При обработке каждой строки лучше разделить на '|', чтобы вы знали, что второй элемент содержит имя животного, а третий элемент содержит имя корпуса. Кто знает, живет ли кошка в конуре.

...