PHP - Как открыть файлы и прочитать их, а затем написать новые с x строк в файле?

Я уже задавал этот вопрос здесь, но ответов не было. Возможно, я сделал что-то не так, поэтому вот еще раз с некоторыми подробностями.

Файлы в каталоге называются 1.txt, 2.txt, 3.txt и т. д.. Фрагмент ниже входит в этот каталог, открывает все файлы *, txt, читая их, удаляет дубликаты и создает один файл со всеми уникальное содержимое. (имена в данном случае).

$files = glob($dirname."/*.txt"); //matches all text files
    $lines = array();
    foreach($files as $file)
    {
    $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
    }
    $lines = array_unique($lines);
    file_put_contents($dirname."/allofthem.txt", implode("\n", $lines));
    }

Вышеупомянутое отлично работает для меня! Благодаря большой помощи здесь, в stackoverflow.

Но я хочу сделать еще один шаг вперед.

Вместо одного большого дубликата бесплатного файла allofthem.txt, как я могу изменить приведенный выше код, чтобы создать файлы с максимальным количеством строк 5oo каждый из новых данных?

Им нужно перейти в новый каталог, например, $dirname."/done/".$i.".txt" Я пытался считать в цикле, но мои усилия не сработали, и в итоге получилось миля.

Я также попытался вставить 500 в массив, увеличить его до другого массива и сохранить таким образом. Не повезло. Я просто не "понимаю".

Опять же, этому новичку нужна помощь специалиста. Заранее спасибо.


person Jim_Bo    schedule 11.09.2010    source источник


Ответы (2)


Когда у вас есть массив строк в соответствии с вашим кодом, вы можете разбить его на куски по 500 строк, используя array_chunk, а затем записать каждый фрагмент в отдельный файл:

// ... from your code
$lines = array_unique($lines);

$counter = 1;
foreach (array_chunk($lines, 500) as $chunk)
{
  file_put_contents($dirname . "/done/" . $counter . ".txt", implode("\n", $chunk));
  $counter++;
}
person Daniel Vandersluis    schedule 11.09.2010

эта функция доставит вас куда-нибудь!

function files_identical($fn1, $fn2) {
    if(filetype($fn1) !== filetype($fn2))
        return FALSE;

    if(filesize($fn1) !== filesize($fn2))
        return FALSE;

    if(!$fp1 = fopen($fn1, 'rb'))
        return FALSE;

    if(!$fp2 = fopen($fn2, 'rb')) {
        fclose($fp1);
        return FALSE;
    }

    $same = TRUE;
    while (!feof($fp1) and !feof($fp2))
        if(fread($fp1, 4096) !== fread($fp2, 4096)) {
            $same = FALSE;
            break;
        }

    if(feof($fp1) !== feof($fp2))
        $same = FALSE;

    fclose($fp1);
    fclose($fp2);

    return $same;
}

Источник: http://www.php.net/manual/en/function.md5-file.php#94494

person RobertPitt    schedule 11.09.2010