【问题标题】:Sort and remove duplicates line by line in text file在文本文件中逐行排序和删除重复项
【发布时间】:2016-06-14 03:00:25
【问题描述】:

所以我有了想要排序的文本文件。文本文件的内容如下所示: 我在写的时候在每一行的末尾使用了“\r\n”

Gere 是我用来写这个的代码:

$name = $_POST['name'];
$email = $_POST['email'];

$fileName = "GuestBook.txt";

  $fh = fopen($fileName, "a");
    fwrite($fh, $name);
    fwrite($fh, "----");
    fwrite($fh, $email . "\r\n");
  fclose($fh);

在记事本上打开 txt 文件看起来像这样:

aaa----aaa
ggg----ggg
sss----sss
www----www
ttt----ttt
ppp----ppp
ggg----ggg
zzz----zzz
www----www

现在我希望它显示已删除重复的排序:

aaa----aaa
ggg----ggg
ppp----ppp
sss----sss
ttt----ttt
www----www
zzz----zzz

这是我为它们排序所做的:

$fileName = "GuestBook.txt";

$data = file_get_contents($fileName);
$split = explode("\n",$data);

sort($split);

$data = implode("\n",$split);

file_put_contents($fileName, $data);

这就是我用来删除重复项的方法

$fileName = "GuestBook.txt";

$lines = file($fileName);
$lines = array_unique($lines);

file_put_contents($fileName, implode("\n",$lines));

【问题讨论】:

  • 是的,我做到了,我可以进行排序并删除重复的代码...
  • 那是资本!
  • 那些在函数 sort_book() 和 remove_dups() 里面我有一个按钮,当我点击时,我会调用这些函数和另一个读取函数的代码
  • 顺便说一句,根据 PHP 文档,array_unique 也会对结果数组进行排序。

标签: php arrays file sorting duplicates


【解决方案1】:

要从文件中获得排序和唯一的输出,您可以执行以下操作:

首先将文件读入带有file() 的数组,因此您将每一行作为一个数组元素。然后你可以使用array_unique() 这样你就只有独特的线条/元素了。

之后,您可以使用usort() 对数组进行排序并应用strcasecmp 作为回调。

代码:

<?php

    $fileName = "GuestBook.txt";
    $lines = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $lines = array_unique($lines);

    usort($lines, "strcasecmp");

    print_r($lines);

?>

如果你想存储它们已经是唯一的,你可以这样做:

还可以使用file() 将文件读入一个数组,如果您的数组中已有该值,只需使用in_array() 检查即可。如果不使用 file_put_contents() 将值添加到文件中。

代码:

<?php

    $name = $_POST['name'];
    $email = $_POST['email'];

    $fileName = "GuestBook.txt";

    $lines = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    if(!in_array($name . "----" . $email, $lines)){
        file_put_contents($fileName, $name . "----" . $email . "\r\n", FILE_APPEND);
    }

?>

如果你想添加已经排序到文件中的值,你可以这样做:

再次将您的文件放入数组中,将值添加到数组中,对其进行排序,然后您可以再次将其放回。

代码:

<?php

    $name = $_POST['name'];
    $email = $_POST['email'];

    $fileName = "GuestBook.txt";

    $lines = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $lines[] = $name . "----" . $email;

    usort($lines, "strcasecmp");

    file_put_contents($fileName, implode("\r\n", $lines), FILE_APPEND);


?>

当然,如果您希望它们已经唯一且已排序,只需将上面的两个代码 sn-ps 组合起来即可。

【讨论】:

  • 我可以使用 file_put_contents($fileName, $lines) 放回我的 txt 文件吗?谢谢
  • @javaMan1995 视情况而定,如果您的所有数据都在 $lines 中,并且在每个值的末尾都有一个新行,您可以像这样将其放回:file_put_contents($fileName, $lines)。如果他们再次需要新线路,只需implode() 他们,然后再将其放回:file_put_contents($fileName, implode("\r\n", $lines)。如果您只想将一个值附加到文件中,则必须设置标志,例如file_put_contents($fileName, $name . "----" . $email . "\r\n", FILE_APPEND)
【解决方案2】:

将文件加载到数组中,删除重复项,然后排序:

$lines = array_unique(file('/path/to/file.txt'));
sort($lines);

根据文件结构,您可以使用FILE_IGNORE_NEW_LINESFILE_SKIP_EMPTY_LINES 之一或两者。

然后保存,如果你不使用FILE_IGNORE_NEW_LINES(如果是你必须添加它们):

file_put_contents('/path/to/file.txt', $lines);

【讨论】:

  • 成功了。非常感谢!但是,有没有办法将它们放在原始文本文件中?像我可以使用 file_put_contents($fileName, $lines) 放回我的 txt 文件吗?谢谢
  • 是的,你所拥有的应该可以工作,如果没有,那么确保错误报告是关于你可能有权限问题或什么的。
【解决方案3】:
<?php
$fh = fopen('file.txt', 'r');
$lines = array();
while ( $line = fgets($fh) ) {
  $lines[] = $line;
}
$arr = array_unique($lines);
foreach ( $arr as $line ) {
  echo $line . "\r\n";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多