Я искал подобную функцию для этого.Мне нужны были каталоги в качестве ключей и подкаталоги в виде массивов и файлов, которые просто помещались в качестве значений.
Я использовал следующий код:
/**
* Return an array of files found within a specified directory.
* @param string $dir A valid directory. If a path, with a file at the end,
* is passed, then the file is trimmed from the directory.
* @param string $regex Optional. If passed, all file names will be checked
* against the expression, and only those that match will
* be returned.
* A RegEx can be just a string, where a '/' will be
* prefixed and a '/i' will be suffixed. Alternatively,
* a string could be a valid RegEx string.
* @return array An array of all files from that directory. If regex is
* set, then this will be an array of any matching files.
*/
function get_files_in_dir(string $dir, $regex = null)
{
$dir = is_dir($dir) ? $dir : dirname($dir);
// A RegEx to check whether a RegEx is a valid RegEx :D
$pass = preg_match("/^([^\\\\a-z ]).+([^\\\\a-z ])[a-z]*$/i", $regex, $matches);
// Any non-regex string will be caught here.
if (isset($regex) && !$pass) {
//$regex = '/'.addslashes($regex).'/i';
$regex = "/$regex/i";
}
// A valid regex delimiter with different delimiters will be caught here.
if (!empty($matches) && $matches[1] !== $matches[2]) {
$regex .= $matches[1] . 'i'; // Append first delimiter and i flag
}
try {
$files = scandir($dir);
} catch (Exception $ex) {
$files = ['.', '..'];
}
$files = array_slice($files, 2); // Remove '.' and '..'
$files = array_reduce($files, function($carry, $item) use ($regex) {
if ((!empty($regex) && preg_match($regex, $item)) || empty($regex)) {
array_push($carry, $item);
}
return $carry;
}, []);
return $files;
}
function str_finish($value, $cap)
{
$quoted = preg_quote($cap, '/');
return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap;
}
function get_directory_tree($dir)
{
$fs = get_files_in_dir($dir);
$files = array();
foreach ($fs as $k => $f) {
if (is_dir(str_finish($dir, '/').$f)) {
$fs[$f] = get_directory_tree(str_finish($dir, '/').$f);
} else {
$files[] = $f;
}
unset($fs[$k]);
}
$fs = array_merge($fs, $files);
return $fs;
}
Там есть что взять.Первая функция get_files_in_dir
Функция была создана, чтобы я мог получить все файлы и папки в каталоге на основе регулярного выражения.Я использую его здесь, потому что он имеет некоторую проверку ошибок, чтобы убедиться, что каталог преобразован в массив.
Далее, у нас есть простая функция, которая просто добавляет косую черту в конец строки, если нет 't там уже есть.
Наконец, у нас есть функция get_directory_tree
, которая будет перебирать все папки и подпапки и создавать ассоциативный массив, где имена папок - это ключи, а файлы - значения (еслипапка имеет подпапки).