С кружкой кофе на столе, решил подготовить пост к пятнице. Но для этого мне нужен скрипт, который "склеит" все файлы из указанной папки. А после этого посчитает количество строк в получившемся холсте. Особенность скрипта заключается в том, что он группирует сумму строк из файлов по расширению.
В функции associations вы можете сформировать мапинг, в соответствии с которым, будет выведен на экран общий подсчет.
Если вдруг, по необъяснимым причинам, вы все еще пользуетесь версией php ниже 5.4, то нужно заменить объявление массива на классический вариант. Подробнее...
<?php
function associations() {
return [
'Text' => ['txt', 'csv', 'md'],
'PHP' => ['php'],
'JavaScript' => ['js', 'coffee'],
'CSS' => ['css', 'sass', 'scss', 'less'],
'Images' => ['jpg', 'jpeg', 'gif', 'png', 'ico', 'icon'],
];
}
Да, да! Он может подсчитать количество строк в изображении. Работает это также, как если бы вы открыли изображение в текстовом редакторе.
К делу. Заранее прошу прощения за мое немногословие в комментариях в скрипте, я накидал его "на коленке".
<?php
$dir = '/path/to/dir/that/is/need/to/be/calculated';
$result = [];
initialize();
calculation($dir);
print_results();
function initialize() {
global $result;
foreach (associations() as $type => $assoc) {
foreach ($assoc as $ext) {
$result[$type][$ext] = 0;
}
}
}
function calculation($dir) {
foreach (scandir($dir) as $filename) {
$file = $dir . '/' . $filename;
// Recursive processing directories.
if (is_dir($file)) {
// Exclude current and parent directory.
if (!in_array($filename, ['.', '..'], TRUE)) {
calculation($file);
}
}
// Fix for Windows.
elseif ($filename != 'desktop.ini') {
counting($file, $filename);
}
}
}
function associations() {
return [
'Text' => ['txt', 'csv', 'md'],
'PHP' => ['php'],
'JavaScript' => ['js', 'coffee'],
'CSS' => ['css', 'sass', 'scss', 'less'],
'Images' => ['jpg', 'jpeg', 'gif', 'png', 'ico', 'icon'],
];
}
function get_type($filename) {
$ext = get_extension($filename);
$type = NULL;
foreach (associations() as $assoc => $ext_list) {
if (in_array($ext, $ext_list)) {
$type = $assoc;
break;
}
}
return [
'type' => $type ?: 'Other',
'ext' => $ext,
];
}
function get_extension($filename) {
if (strpos($filename, '.') !== FALSE) {
$ext_parts = explode('.', $filename);
$ext = end($ext_parts);
}
else {
$ext = $filename;
}
return strtolower($ext);
}
function counting($file, $filename) {
global $result;
$assoc = get_type($filename);
$type = $assoc['type'];
$ext = $assoc['ext'];
if (isset($result[$type])) {
$result[$type][$ext] += count(file($file));
}
else {
$result['Other'][$ext] = count(file($file));
}
}
function count_by_type() {
global $result;
$count_by_type = [
'total' => 0,
];
foreach ($result as $type => $sizes) {
$count_by_type[$type] = 0;
foreach (array_filter($sizes) as $ext => $size) {
$count_by_type[$type] += $size;
$count_by_type['total'] += $size;
}
}
return $count_by_type;
}
function print_results() {
global $result;
$count_by_type = count_by_type();
print 'Total: ' . $count_by_type['total'];
print '<ul>';
foreach ($result as $type => $sizes) {
print '<li>' . $type . ' - ' . $count_by_type[$type] . '<ul>';
foreach (array_filter($sizes) as $ext => $size) {
print '<li>' . $ext . ' - ' . $size;
}
print '</ul></li>';
}
print '</ul>';
}
Как это работает
Предположим у вас уже есть рабочий php-сервер. Например, Denwer или Open Server.
- Берем весь код из блока выше
- Помещаем его в отдельный файл. Например, index.php
- Вписываем полный путь до папки, в которой лежат файлы для подсчета, в переменную $dir, в начале скрипта.
- Пишем свой маппинг в функции associations, где ключ - это человеко-понятный заголовок группы, а значение - это массив расширений, которые должны входит в эту группу. Можно оставить пустым ( return array(); ), тогда будет выведен список расширений и общее количество строк в них.
- Запускаем файл index.php в браузере и любуемся.
P.S.
В консоли тоже должно работать
cd path/to/dir/with/index-file
php index.php
Результат
Возьмем любой проект с гихаба. Например, bootstrap-datepicker и положим его в папку datepicker. Пишу путь до папки datepicker, который у меня такой:
<?php
$dir = 'D:\Servers\PHP\domains\datepicker';
Запускаем скрипт и смотрим результат
Total: 19401
Text - 499
txt - 1
md - 498
PHP -
JavaScript - 11893
js - 11893
CSS - 3420
css - 2656
less - 764
Images - 1027
png - 1027
Other - 2562
editorconfig - 11
gitignore - 10
yml - 9
license - 202
json - 99
map - 4
makefile - 153
html - 442
py - 249
rst - 1119
bat - 190
jshintrc - 33
jscsrc - 22
csslintrc - 19