2011-10-25 56 views
0

写入文件我目前有此块:修改字符串数组和PHP

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 

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

+0

就在'list($ title,...)'行之前,添加'print($ lines _ [$ counter])''。它是否包含正确的信息? – bos

+0

不,它没有。我相信我知道了。看来我不能用'==='在if语句中进行比较。 '=='虽然工作。 – n0pe

回答

2

因为file_put_contents被写入从中读取同一个地方,这是一个HTML表单,我建议锁定该文件,因此它不是由多个损坏写道一次:

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

如果事情仍然看起来很奇怪,var_dump(或日志)$ post以及$ lines _ [$ counter]以确保您的值是您期望的值

0

我认为您遇到的问题是您的foreach语句下方的代码将会即使文件中没有行符合if语句,也总是执行。

在这种情况下,$ 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;