Сегодня работаю с файлами — PHP codes. В рамках решения одного проекта возникла необходимость читать все файлы из директорий. Обрабатывать по определенным критериям и записывать в базу данных. Структура папок выглядит следующим образом:
# code … —dir[input]— —dir[PHP-tutorials-Accessing-Databases-Object-Oriented-PHP] —dir[00. Introduction] —>01. Welcome.srt —>02. What you should know before watching this course.srt —>03. Using the exercise files.srt —>04. Setting SQLite permissions.srt —>05. A quick primer on using PHP objects.srt —dir[01. Why Use Object-Oriented PHP to Access a Database] —>01. Overview of PHP database APIs.srt —>02. Using prepared statements.srt —>03. Using transactions.srt
# code … —dir[input]— —dir[PHP-tutorials-Accessing-Databases-Object-Oriented-PHP] —dir[00. Introduction] —>01. Welcome.srt —>02. What you should know before watching this course.srt —>03. Using the exercise files.srt —>04. Setting SQLite permissions.srt —>05. A quick primer on using PHP objects.srt —dir[01. Why Use Object-Oriented PHP to Access a Database] —>01. Overview of PHP database APIs.srt —>02. Using prepared statements.srt —>03. Using transactions.srt |
То есть: Название курса -> Название темы -> Вложенные файлы. Нужно каждый файл взять для обработки, извлечь из него нужную информацию $timecode и $subtitles, а так же «запомнить» Название курса -> Название темы.
Реализовано в виде двух функций:
- scandir_through($dir) в качестве аргумента передаю имя корневой директории [input]. Функция сканирует директории, оставляя только файлы и складывает их в массив, для передачи следующей функции.
- recDB($file) принимает массив и оставляя только две строки $timecode и $subtitles записывает в базу данных
# code … // вывод в массив полных путей директорий и файлов // http://php.net/manual/ru/function.glob.php#97899 function scandir_through($dir) { $items = glob($dir . ‘/*’); for ($i = 0; $i < count($items); $i++) { if (is_dir($items[$i])) { $add = glob($items[$i] . ‘/*’); $items = array_merge($items, $add); } } // удаляю элементы не содержащие .srt // https://php.ru/forum/threads/udalenie-ehlementa-massiva-so-sdvigom-ostalnyx.14248/ foreach ($items as $key => $value) { if(preg_match(‘/.srt/’, $items[$key], $match) == 0){ unset($items[$key]); // array_shift($items); } } sort($items); return $items; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# code … // вывод в массив полных путей директорий и файлов // http://php.net/manual/ru/function.glob.php#97899 function scandir_through($dir) { $items = glob($dir . ‘/*’); for ($i = 0; $i < count($items); $i++) { if (is_dir($items[$i])) { $add = glob($items[$i] . ‘/*’); $items = array_merge($items, $add); } } // удаляю элементы не содержащие .srt // https://php.ru/forum/threads/udalenie-ehlementa-massiva-so-sdvigom-ostalnyx.14248/ foreach ($items as $key => $value) { if(preg_match(‘/.srt/’, $items[$key], $match) == 0){ unset($items[$key]); // array_shift($items); } } sort($items); return $items; } |
# code … // функция извлекает удаляет пустые строки и пишет в базу $timecode, $subtitle и $file — путь function recDB($file) { $text = file($file); foreach ($text as $value) { if(strlen($value) >= 6){ // пропускаем пустые строки и номера $needle = ‘—>’; $pos = strripos($value, $needle); switch ($pos) { case ’13’: echo $timecode = $value; // пишем в базу: поле timecode break; default: echo $subtitle = $value; // пишем в базу: поле subtitle break; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# code … // функция извлекает удаляет пустые строки и пишет в базу $timecode, $subtitle и $file — путь function recDB($file) { $text = file($file); foreach ($text as $value) { if(strlen($value) >= 6){ // пропускаем пустые строки и номера $needle = ‘—>’; $pos = strripos($value, $needle); switch ($pos) { case ’13’: echo $timecode = $value; // пишем в базу: поле timecode break; default: echo $subtitle = $value; // пишем в базу: поле subtitle break; } } } } |
Полезные ссылки в самом коде в качестве комментариев. Во второй функции еще нужно дописать вывод в БД)