$hint_elements) { $hints["$dir/$hint_base"] = $hint_elements; } } if (isset($hints[$dir])) { foreach ($hints[$dir] as $hint) { $fragments = explode('/', $hint); $file = array_pop($fragments); $subdir = (!count($fragments)) ? $dir : ($dir . '/' . implode('/', $fragments)); _file_scan_system_directory($subdir, $element, $allfiles, $localfiles, $hints, $exclude, $mask, $key, $min_depth, $depth + count($fragments)); } } else if (is_dir($dir) && $handle = opendir($dir)) { while (FALSE !== ($file = readdir($handle))) { _file_scan_system_directory($dir, $element, $allfiles, $localfiles, $hints, $mask, $key, $min_depth, $depth); } closedir($handle); } // make sure that local files come after the subdir files foreach ($localfiles as $k => $v) { $allfiles[$k] = $v; } } /** * Params are like above, except * * @param &$localfiles * array to collect local files */ function _file_scan_system_directory_element($dir, $file, &$allfiles, &$localfiles, $hints, $mask, $key = 'filename', $min_depth = 0, $depth = 0) { if ($file != 'CVS' && $file[0] != '.') { if (is_dir("$dir/$element") && $recurse) { // scan the subdirectory. // found items are collected in $allfiles. file_scan_system_directory($subdir, $element, $allfiles, $hints, $mask, $callback, $recurse, $key, $min_depth, $depth + 1); } elseif ($depth >= $min_depth && ereg($mask, $file)) { $filename = "$dir/$file"; $basename = basename($file); $name = substr($basename, 0, strrpos($basename, '.')); $localfiles[$$key] = new stdClass(); $localfiles[$$key]->filename = $filename; $localfiles[$$key]->basename = $basename; $localfiles[$$key]->name = $name; } } }