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);
我有一个如下所示的文件:
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);