使用“fgets()”读取文件时附加了不需要的换行符的文本行

问题描述 投票:0回答:1

这有效

$arr = array_merge(array_diff($words, array("the","an"));

为什么这不起作用?

$common 由数组中的 40 个单词组成。

$arr = array_merge(array_diff($words, $common));

还有其他解决方案吗?

供参考:

<?php
error_reporting(0);
$str1= "the engine has two ways to run: batch or conversational. In batch, expert system has all the necessary data to process from the beginning";

common_words($str1);

function common_words(&$string) { 

    $file = fopen("common.txt", "r") or exit("Unable to open file!");
    $common = array();

    while(!feof($file)) {
      array_push($common,fgets($file));
    }
    fclose($file);
    $words = explode(" ",$string);
    $arr = array_merge(array_diff($words, array("the","an")));
    print_r($arr);
}
?>
php fgets trailing-newline
1个回答
3
投票

有时,空白是邪恶的..

fgets
只有一个参数将从提供的文件句柄中返回一行数据。

但是,它不会删除返回行中的尾随换行符(

"\n"
或任何使用的 EOL 字符)。

由于

common.txt
似乎每行一个单词,这就是为什么当你使用
array_diff
时php找不到任何匹配元素的原因。

PHP:fgets - 手册

参数:长度

读取结束当读取长度 - 1 个字节时,换行符(包含在返回值中)或 EOF(以先到者为准)。如果未指定长度,它将继续从流中读取,直到到达行尾。

改写

  • 关闭
    $common
    的所有条目都会有一个尾随换行符,就像您现在所做的那样。

替代解决方案1

如果您不打算处理

common.txt
中的条目,我建议您查看 php 的函数
file
,并将其与
array_map
一起使用到
rtrim
行。

$common = array_map ('rtrim', file ('common.txt')); // will do what you want

替代解决方案2

@MarkBaker 看到上面的解决方案后,他发表了评论说你不妨将一个标志传递给

file
以使其以相同的方式工作,无需调用 array_map 来“修复”返回的条目.

$common = file ('common.txt', FILE_IGNORE_NEW_LINES);
© www.soinside.com 2019 - 2024. All rights reserved.