修改字符串数组并在PHP中写入文件

时间:2011-10-25 23:35:28

标签: php arrays file-io

我目前有这个块:

if ($type == "up") {
    $lines_ = file('../indexIncomplete');
    $counter = 0;
    foreach ($lines_ as $value) {
        $postLen = strlen($post);
        if ( substr($value, 0, $postLen) === $post ) {
            break;
        }
        $counter++;
    }
    list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]);
    $votes = $votes + 1;
    $newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date;
    $lines_[$counter] = $newValue;
    file_put_contents('../indexIncomplete', $lines_);
}

这包含在HTML页面中,其中包含调用它的表单(这个块上面有一些逻辑可以进行验证和填充,我在这里缩小了问题)。

我将文件的内容拉入数组。然后我查看数组以查看其中一个是否匹配$post(前面声明的字符串)。如果它匹配,则循环中断并且计数器指向包含匹配字符串的数组中的位置。然后我抓住字符串的不同部分(使用explode())。我抓住$value并递增它并重建一个新的数组条目。我用旧的数组条目替换旧的数组条目:

$lines_[$counter] = $newValue;

我将新数组写回文件。问题是,$newValue写入时似乎没有选择除$votes以外的任何其他变量,使它看起来像这样:

||1||

数字是正确的投票数。它应该看起来像这样:

$title|$location|$votes|$poster|$date

此外,它没有出现在它应该的线上。而是将其附加到文件的末尾。我很困惑。

2 个答案:

答案 0 :(得分:2)

由于file_put_contents正在写入读取它的同一个地方,这是一个html表单,我建议锁定该文件,使其不会被多次写入一次性破坏:

$file_put_contents('../indexIncomplete', $lines_, LOCK_EX);

如果事情仍然看起来很糟糕,var_dump(或log)$ post以及$ lines _ [$ counter]以确保你的价值符合预期

答案 1 :(得分:0)

我认为您遇到的问题是,即使文件中的所有行都与if语句不匹配,foreach语句下面的代码也将始终执行。

在这种情况下,$ counter将设置为比数组中最后一个元素高一的值。这意味着当你调用“$ lines _ [$ counter]”时你将访问一个不存在的数组键,它将返回“null”(PHP不会像java那样执行数组越界错误,尽管它会给出E_NOTICE级别警告)

由于计数器的值比数组的大小长1,因此它将附加到文件的末尾。

我建议您在休息之前将此代码移到foreach中。

list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]);
$votes = $votes + 1;
$newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date;
$lines_[$counter] = $newValue;