* @param string $pattern pattern for native glob function * @param int|string $flags any valid flag for glob function * @param bool $onlyFiles to filter return array with only matched files, or all matched results * @return array array containing the recursive glob results * * Example: * * Common::rglob("/example/path/*"); * * it will returns: * * Array * ( * [0] => /example/path/README.txt * [1] => /example/path/composer.json * [4] => /example/path/one/one_text.txt * [6] => /example/path/two/two_text.txt * [7] => /example/path/two/two_one/two_one_text.txt * [8] => /example/path/two/two_one/build.json * ) * * Example 2: * * Common::rglob("/example/path/*.json"); * * it will returns: * * Array * ( * [0] => /example/path/composer.json * [1] => /example/path/two/two_one/build.json * ) */ public static function rglob($pattern, $flags = 0, $onlyFiles = false) { $singlePattern = basename($pattern); if (strpos($singlePattern, "*") !== false) { $path = rtrim(str_replace($singlePattern, "", $pattern), DIRECTORY_SEPARATOR); } else { $singlePattern = ""; $path = $pattern; } $files = glob("$path/$singlePattern", $flags); $dirs = glob("$path/*", GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); foreach ($dirs as $dir) { $files = array_merge($files, self::rglob("$dir/$singlePattern", $flags)); } if ($onlyFiles) { $files = array_filter($files, function($v) { return is_dir($v) ? false : true;}); } return $files; } /** * Returns the last version given a pattern of file name * * @param string $pattern a valid pattern for glob(...) native function * @param int $flag php flags for glob(...) native function * @return int */ public static function getLastVersion($pattern, $flag = 0) { $files = glob($pattern, $flag); $maxVersion = 0; foreach ($files as $file) { $filename = basename($file); if (preg_match("/-([0-9]+)/", $filename, $match)) { if ($maxVersion < $match[1]) { $maxVersion = $match[1]; } } } return $maxVersion; } }