Как сравнить данные из файла и записать уникальные?

Olga93

Новичок
У меня в файле 100 записей url-ссылок, туда будут добавляться новые ссылки сразу по 10-20. Как сравнить данные и добавить только уникальные (без дубликатов) ссылок? Что-то вроде пересечения данных.

Вот файл ссылками data1.txt:
А вот пример где я добавляю новые ссылки.
PHP:
$arr = Array("https://site.ru/592523","https://site.ru/593212","https://site.ru/594532","https://site.ru/596432",
"https://site.ru/215960","https://site.ru/597323","https://site.ru/595631","https://site.ru/595212","https://site.ru/592345","https://site.ru/598742");

foreach($arr as $data)
{
  file_put_contents('data1.txt',$data."\r\n",FILE_APPEND);
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
sort file | uniq > newfile и не пытаться решать это на пыхапе, ибо рано или поздно это встанет колом

Ну хотя бы sqlite взять какой
 

Valick

Новичок
PHP:
<?php
declare(strict_types=1);

class UrlManager
{
    private string $fileName;

    public function __construct(string $fileName)
    {
        $this->fileName = $fileName;
    }

    public function add(string $url)
    {
        if ($this->check($url)) {
            return false;
        }
        $f = fopen($this->fileName, 'ab');
        if (fwrite($f, PHP_EOL . $url) === false) {
            throw new Exception('Не удалось записать в файл');
        }

        return true;
    }

    public function check(string $url): bool
    {
        $f = fopen($this->fileName, 'rb');
        if ($f === false) {
            throw new Exception('Не удалось открыть файл');
        }
        while (!feof($f)) {
            if (trim(fgets($f)) === trim($url)) {
                fclose($f);
                return true;
            }
        }
        fclose($f);

        return false;
    }
}

try {
    $fileName = 'data1.txt';
    $manager = new UrlManager($fileName);
    $manager->add('https://site.ru/368395');
    $manager->add('https://site.ru/new');
} catch (Exception $e) {
    echo $e->getMessage();
}
 

AnrDaemon

Продвинутый новичок
mv -b -- oldfile oldfile && cat oldfile~ newfile | sort -u > oldfile
 
Последнее редактирование:

ivanov77

Новичок
Я б убрал из файла вот эту часть строки - "https://site.ru/".
И можно было бы грузануть его всего через file(), а потом просто этот массив вычитать от добавляемого. Код не дам, сами должны такое уметь
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я б убрал из файла вот эту часть строки - "https://site.ru/".
И можно было бы грузануть его всего через file(), а потом просто этот массив вычитать от добавляемого. Код не дам, сами должны такое уметь
решение не очень, так скажем, при росте числа строк - может случиться непредсказуемое))
 

ksnk

прохожий
Сохранять как изображение массива php. Читать с помощью include. генерировать с помощью var_export. Ключи массива - нужные строки, так минимальными телодвижениями достигается уникальность.
PHP:
<?php
return [
'https://site.ru/592077'=>'',
'https://site.ru/581777'=>'',
'https://site.ru/795050'=>'',
// ...
];
Для небольшого файла с нечастой перезаписью будет относительно прилично работать...
Ну а так - найди время исправить ошибку работы с БД, иначе будешь искать время для отладки ошибок работы с большими файлами.
 
Сверху