fopen 正在复制同一行

fopen is duplicating the same line

我有一个如下所示的文件:

1||Allan||34||male||USA||||55.789.980
2||Georg||32||male||USA||||55.756.180
3||Rocky||21||male||USA||[100][200]||55.183.567 

我创建了一个函数,在执行时添加一个给定的数字,如果已经存在则删除它,在这个例子中是 $added 并且等于 100。这是我的代码:

$added = $_GET['added']; //100 for this example

$f = fopen($file, "w");
$list = file($file);
foreach ($list as $line) {
    $details = explode("||", $line);
    if (preg_match("~\b$details[0]\b~", 3)) {
        foreach ($details as $key => $value) {
            if ($key == 5) {
                $newline .= str_replace("[" . $added . "]", "", $value);
            } else {
                $newline .= $value . "||";
            }
        }
        $line = $newline . "\n";
    }
    fputs($f, $line);
}
fclose($f);
}

这段代码应该从 Rocky 行中删除 [100],因为它已经存在了。但是,在进一步执行而不是将其添加回去时,它会复制 Rocky 行并将其弄乱,因此文件如下所示:

1||Allan||34||male||USA||||55.789.980
2||Georg||32||male||USA||||55.756.180
3||Rocky||21||male||USA||[100][200]55.183.567

3||Rocky||21||male||USA||[100][200]55.183.567 
||
||

为什么要这样做?我无法理解它...

谢谢。

首先,您应该在打开文件进行输出之前读取文件,因为使用 w 模式打开会截断文件。

其次,如果您只想更改其中一个字段,则无需遍历 $details 中的字段。只需按索引访问和分配即可。

然后你可以把这条线和implode()一起放回去。

$list = file($file);
$f = fopen($file, "w");
foreach ($list as $line) {
    $details = explode("||", $line);
    if (preg_match("~\b$details[0]\b~", 3)) {
        if (strpos("[$added]", $details[5]) === false) {
            $details[5] = "[$added]" . $details[5];
        } else {
            $details[5] = str_replace("[$added]", "", $details[5]);
        }
        $line = implode('||', $details)
    }
    fputs($f, $line);
}
fclose($f);