为什么它在PHP数组中应该先开始一行



我在数组和文件写入方面遇到了问题,我想做的是获取一个文件,并将其复制到另一个文件上,除非添加了格式。

具体来说,这是:

第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.
 */
 ?>

我相信有一种更好的方法可以实现我正在尝试的最终目标,那就是检测表单中输入的某些单词。(可能有一种比制作输入内容的格式化和非格式化副本更好的方法。)。

起初我认为这是因为我使用return键手动编写OLDFILE。所以我制作了一个脚本,用\n来写它,但它没有任何变化。

Eh:)

首先,请查看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);

顺便说一句:你可以写普通的代码,在文本区标记它,通过点击ctrl+k,它会缩进4个空格

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

更改此

$listArrayf1[] = fgets($file1); 

到此:

$listArrayf1[] = rtrim(fgets($file1), "rn"); 

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

然而,正如你自己所说,你确实在拐弯抹角地做事。只需就可以将所有file1读取到一个数组中

$listArrayf1 = file($filename1);

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

最新更新