Почему он начинает новую строку раньше, чем в массиве PHP? - PullRequest
3 голосов
/ 20 января 2012

У меня проблема с массивами и записью файлов, я хочу взять один файл и скопировать его в другой файл, за исключением добавления к нему форматирования.

Если быть точным, это:

Строка 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 ]

2 голосов
/ 20 января 2012

Eh:)

Сначала посмотрите на var_dump и проверьте, что возвращает функция (ничего, поэтому правильное использование var_dump( ...); echo "<br />";)

Во-вторых, fgets читает строку , включая символ новой строки, поэтому я думаю, что вы видите в своей строке что-то вроде этого:

string( 10) "abcdefghi
"

Таким образом, вы должны удалить новую строку вручную, например с помощью trim .

Далее я бы порекомендовал (по крайней мере) взглянуть на foreach .

Итак, я написал весь циклas:

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: вы можете написать нормальный код, пометить его в текстовой области и, нажав ctrl+k, он получит отступ в 4 пробела

1 голос
/ 20 января 2012

fgets возвращает символ новой строки в конце каждой строки как часть ввода. Вот откуда появился ваш «дополнительный» перевод строки.

Изменить это

$listArrayf1[] = fgets($file1); 

к этому:

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

Это удалит символы новой строки из конца возвращаемого значения и отформатирует строки в соответствии с назначением.

Однако , как вы сказали сами, вы действительно делаете вещи окольным путем. Вы можете прочитать весь файл file1 в массив всего за

$listArrayf1 = file($filename1);

Вот и все. Нет циклов, нет fopen, нет проблем с переводом строки. Стоит искать наиболее подходящий способ ведения дел.

...