作为 CodeIgniter 的爱好者,我实际上已经修改了核心directory_helper,使其除了设置深度和选择是否应包含隐藏文件之外,还包括使某些文件免于扫描的能力。
所有功劳归于 CI 的原作者。我只是用豁免数组添加到它并在排序中构建。
它使用 ksort 对文件夹进行排序,因为文件夹名称被设置为键,而 natsort 对每个文件夹中的文件进行排序。
您可能需要做的唯一一件事就是为您的环境定义 DIRECTORY_SEPARATOR 是什么,但我认为您不需要修改太多其他内容。
function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE, $exempt = array())
{
if ($fp = @opendir($source_dir))
{
$folddata = array();
$filedata = array();
$new_depth = $directory_depth - 1;
$source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
while (FALSE !== ($file = readdir($fp)))
{
// Remove '.', '..', and hidden files [optional]
if ($file === '.' OR $file === '..' OR ($hidden === FALSE && $file[0] === '.'))
{
continue;
}
is_dir($source_dir.$file) && $file .= DIRECTORY_SEPARATOR;
if (($directory_depth < 1 OR $new_depth > 0) && is_dir($source_dir.$file))
{
$folddata[$file] = directory_map($source_dir.$file, $new_depth, $hidden, $exempt);
}
elseif(empty($exempt) || !empty($exempt) && !in_array($file, $exempt))
{
$filedata[] = $file;
}
}
!empty($folddata) ? ksort($folddata) : false;
!empty($filedata) ? natsort($filedata) : false;
closedir($fp);
return array_merge($folddata, $filedata);
}
return FALSE;
}
使用示例是:
$filelist = directory_map('full_server_path');
如上所述,它将文件夹名称设置为子数组的键,因此您可以期待以下内容:
Array(
[documents/] => Array(
[0] => 'document_a.pdf',
[1] => 'document_b.pdf'
),
[images/] => Array(
[tn/] = Array(
[0] => 'picture_a.jpg',
[1] => 'picture_b.jpg'
),
[0] => 'picture_a.jpg',
[1] => 'picture_b.jpg'
),
[0] => 'file_a.jpg',
[1] => 'file_b.jpg'
);
请记住,豁免将应用于所有文件夹。如果您想跳过 index.html 文件或您不想包含的目录中使用的其他文件,这很方便。