为什么它应该在PHP数组之前开始一个新行?

时间:2012-01-19 22:04:50

标签: php arrays file line newline

我遇到了数组和文件写入的问题,我想要做的是获取一个文件,然后将其复制到另一个文件中,除非添加了格式。

具体来说,这个:

第1行 第2行 第3行

会变成这样:

<br /><hr />Line 1  
<br /><hr />Line 2  
<br /><hr />Line 3     

而且我已经完成了这件事,但奇怪的事情发生了。它不是在一行上格式化,而是换行并继续前进。喜欢这个

<br />1
THE END<br />7
THE END<br />0
THE END<br />Red
THE END<br />Silent
THE END<br />No ChangesTHE END   

我的代码是:

<?php

 $filename1 = "directorx_OLDONE.txt";
 $filename2 = "directorx_NEWONE.txt";
 $file1 = fopen($filename1, "r") or exit ("No");
 $file2 = fopen($filename2, "w") or exit ("No");

 while (!feof($file1)){
      $listArrayf1[] = fgets($file1);
 }
 fclose($file1);

 echo var_dump($listArrayf1) . "<br /><br />";


 $entries = count($listArrayf1) - 1;

 echo $entries;

 for($i=0;$i<=$entries;$i++){
      $listArrayf2[] = "<br />".$listArrayf1[$i]."THE END";
      fwrite($file2, $listArrayf2[$i]);
 }
 fclose($file2); 

 echo var_dump($listArrayf2);
 /*

 Open file1, r
 Open file2, w
 While it's not the end of the file, add each line of file1 to an array.
 Count the number of lines in file1 and call it Entries. -1 because gotta start at 0.

 Make a new array with the values of the old one, but with tags before and after it.

 */
 ?>

我确信有一种更好的方法来实现我正在尝试的最终目标,即检测输入到表单中的某些单词,(这可能比制作输入内容的格式化和非格式化副本更好的方法。)但我的PHP词汇是有限的,我想在学习如何更容易之前找出长期的,先决条件的困难方法。

起初我以为是因为我正在使用返回键手动编写OLDFILE。所以我创建了一个脚本来使用\ n来代替它,它没有改变任何内容。

2 个答案:

答案 0 :(得分:2)

呃:)

首先,请查看var_dump并检查函数返回的内容(没有,所以正确使用是var_dump( ...); echo "<br />";

其次,fgets读取字符串包括换行符,所以我猜你在字符串中看到的内容是这样的:

string( 10) "abcdefghi
"

因此,您必须手动删除换行符,例如trim

接下来,我建议(至少)查看foreach

所以我把整个循环写成:

foreach( $listArrayf1 as $row){
  $row = "<br /><hr />". trim( $row)."THE END";
  fwrite($file2, $row);
  $listArrayf2[] = $row;
}

您也可以使用foreach( $listArrayf1 as &$row),最后$listArrayf1将包含与$listArrayf2完全相同的内容。当您需要保留所有其他空格时,您应该使用$row = substr( $row, 0, -1);

btw:你可以编写普通代码,在textarea中标记它,然后点击ctrl+k它将缩进4个空格

答案 1 :(得分:1)

fgets返回每行末尾的换行符,作为其输入的一部分。这就是你的“额外”换行符的来源。

更改此

$listArrayf1[] = fgets($file1); 

到此:

$listArrayf1[] = rtrim(fgets($file1), "\r\n"); 

这将从返回值的末尾删除换行符,并使字符串格式化为预期。

然而,就像你自己说的那样,你真的是以迂回的方式做事。您可以将所有file1读入一个只有

的数组中
$listArrayf1 = file($filename1);

就是这样。没有循环,没有fopen,换行没有问题。寻找最合适的做事方式是值得的。