*/ public array $base_dir2files = array(); function isEmpty() : bool { return empty($this->base_dir2files); } function count() : int { $total = 0; foreach($this->base_dir2files as $base_dir => $files) $total += count($files); return $total; } function apply(callable $fn) { foreach($this->base_dir2files as $base_dir => $files) $this->base_dir2files[$base_dir] = $fn($base_dir, $files); } function filter(callable $filter) { foreach($this->base_dir2files as $base_dir => $files) $this->base_dir2files[$base_dir] = array_filter($files, $filter); } function forEachFile(callable $fn) { foreach($this->base_dir2files as $base_dir => $files) { foreach($files as $file) $fn($base_dir, $file); } } function add(string $base_dir, string $file) { if(!isset($this->base_dir2files[$base_dir])) $this->base_dir2files[$base_dir] = array(); $this->base_dir2files[$base_dir][] = $file; } //returns [[base_dir, file1], [base_dir, file2], ...] function getFlatArray() : array { $flat = []; foreach($this->base_dir2files as $base_dir => $files) { foreach($files as $file) $flat[] = [$base_dir, $file]; } return $flat; } function getAllFiles() : array { $all_files = []; foreach($this->base_dir2files as $base_dir => $files) $all_files = array_merge($all_files, $files); return $all_files; } } function config_scan_files( array $base_dirs, string $ext_filter = '.conf.js', bool $verbose = false ) : ConfigScanResult { $t = microtime(true); $result = new ConfigScanResult(); foreach($base_dirs as $base_dir) { $result->base_dir2files[$base_dir] = scan_files_rec(array($base_dir), array($ext_filter)); } if($verbose) config_log("File scan: {$result->count()}, done " . round(microtime(true) - $t,2) . " sec."); return $result; }