Чтение файлов в хронологическом порядке. Имя файла = дата создания файла
В директории имеются текстовые файлы с именами типа 01012016.txt, 02012016, 03012016... 13092020 и т.д., т.е. в каждый файл пишутся все сообщения за сутки и создается файл. Имя файла - дата.txt. Собственно вопрос: требуется выполнять обработку файлов за несколько лет, которые лежат в одной директории. Читаем содержимое всех файлов и пишем результат в один файл. Подскажите как сделать сортировку массива, чтобы читались файлы в хронологическом порядке, т.е. как они были созданы: 01012016.txt, 02012016, 03012016 ... 13092020, а не 01012016.txt, 01012017.txt, 01012018.txt, 01012019.txt, 01012020.txt.
<?php
$dir="./msg"; // директория с файлами
$files=scandir($dir); // сканируем директорию и помещаем результат в массив $files
array_shift($files); // удаляем из массива '.'
array_shift($files); // удаляем из массива '..'
// Вывод содержимого массива
foreach($files as $spisok){
echo ("<center>".$spisok."</center>");
}
$fw=fopen("./all_msg.txt", "w+"); // Создаем файл в который будем писать всю информацию a+ - дописывать в конец файла, w+ - очищать файл перед записью
foreach ($files as $file){ // В цикле обрабатываем файлы
$fp=fopen($dir."/".$file, "r"); // Открываем файл в режиме чтения
if($fp){
//Считываем файл построчно в переменную stringtext
while(!feof($fp)){
$stringtext=fgets($fp); // Читаем строку из файла
if(!empty($stringtext)){
$stringtext=iconv("cp1251", "UTF-8", $stringtext);// Меняем кодировку текста (исходный файл сохранен в cp1251)
// Разбираем строку
$date=substr($stringtext,0,10); // Вырезаем 10 символов из строки начиная с 0 символа
$time=substr($stringtext,11,10); // Вырезаем 10 символов из строки начиная с 11 символа
$mes=substr($stringtext,strlen($date." ".$time)); // Остаток строки помещеем в переменную $mes
$mes=trim($mes); // Удаляем пробелы в начале и конце строки
$result=$date." ".$time." ".$mes."\r\n"; // Результат для записи в файл
$result_html="<tr class='str'><td>".$date."</td><td>".$time."</td><td>".$mes."</td></tr>"; // Результат для вывода в браузере
fwrite($fw, $result); // записываем текст в созданный файл
}
// Уничтожаем переменныеt
unset($stringtext);
unset($result);
}
}
else {
echo("Ошибка при открытии файла");
}
fclose($fp);
unset($fp);
}
fclose($fw); // закрываем созданный файл
unset($files);
unset($file);
unset($fw);
?>
Ответы (2 шт):
Автор решения: Maxim Timakov
→ Ссылка
<?php
$files=[
"01012016.txt", "01012017.txt",
"01012018.txt", "01012019.txt",
"01012020.txt", "01012016.txt",
"02012016.txt", "03012016.txt",
"13092020.txt"
];
print_r($files);
// преобразуем в список объектов
$files = array_map(function($file){
$obj = new stdClass;
$obj->file = $file;
// получим имя файла
$file_name = pathinfo($file)['filename'];
// инвертируем строку с датой
$obj->date = DateTime::createFromFormat(
'dmY', $file_name)->format('Ymd');
return $obj;
}, $files);
// отсортируем по полю "дата"
uasort($files, function($a, $b) {
return strcmp($a->date, $b->date);
});
print_r($files);
Получить отсортированный список файлов:
$sorted_files = [];
foreach($files as $f)
{
$sorted_files[] = $f->file;
}
print_r($sorted_files);
Автор решения: Ivan Dudarev
→ Ссылка
$files = glob('/path/to/dir/*'); // вернёт массив файлов, элементы будут отсортированы по имени.
sort($files); // Для достоверности сортировки
// дальше foreach, а в нём обработка