从列表中删除项目的最佳方法 php

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

我想从列表A中删除列表B和文本文件中的项目。

例如:a.txt

1
3
6

b.txt

2
3
6

我之前尝试了不止一种方法,但对于大文件来说,它并没有发挥应有的作用。

$a = file('a.txt', FILE_IGNORE_NEW_LINES);
$b = file('b.txt', FILE_IGNORE_NEW_LINES);
$n = 'new.txt';
for ($i = 0;$i < count($b);$i++)
{
    if (!in_array($b[$i], $a))
    {
        $c = file_get_contents($n);
        $c .= $b[$i] . "\n";
        file_put_contents($n, $c);
    }
} 

有没有更好的方法来处理80k行这样的大文件?

php
1个回答
2
投票

这段代码主要是改变了文件的读写方式,使第二个文件每次只读1行,而不是全部在内存中读。 输出也使用了 FILE_APPENDfile_put_contents() 以便它不需要再次读取该文件。

第一部分是创建一个a.txt文件的数组,以该值为索引,让你可以使用 isset() 而非 in_array() 这样会使搜索速度快很多。

然后每次读取第二个文件1行,检查是否存在,如果需要就添加数据......

$fileA = fopen('a.txt', 'r');
$a = [];
while($entry = fgets($fileA))
{
    $a[trim($entry)] = true;
}
$fileB = fopen('b.txt', 'r');
$n = 'new.txt';
// Clear the file
file_put_contents($n, '');
while($b = fgets($fileB))
{
    if (!isset($a[trim($b)]))
    {
        file_put_contents($n, $b, FILE_APPEND);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.