PHP scandir结果:按文件夹文件排序,然后按字母顺序排序
PHP手册:默认情况下,排序顺序为字母升序 我正在构建一个文件浏览器(在Windows中),因此我希望返回的地址按文件夹/文件排序,然后按这些子集的字母顺序排列 示例:现在,我扫描并输出PHP scandir结果:按文件夹文件排序,然后按字母顺序排序,php,sorting,scandir,Php,Sorting,Scandir,PHP手册:默认情况下,排序顺序为字母升序 我正在构建一个文件浏览器(在Windows中),因此我希望返回的地址按文件夹/文件排序,然后按这些子集的字母顺序排列 示例:现在,我扫描并输出 Aardvark.txt BarDir BazDir Dante.pdf FooDir 我想要 BarDir BazDir FooDir Aardvark.txt Dante.pdf 除了usort和is_dir()解决方案(我自己可以找到)之外,有没有一种快速有效的方法 写作的忍者在正确的轨道上-这是最好
Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir
我想要
BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf
除了usort
和is_dir()
解决方案(我自己可以找到)之外,有没有一种快速有效的方法
写作的忍者在正确的轨道上-这是最好的方式吗?这能给你想要的吗
function readDir($path) {
// Make sure we have a trailing slash and asterix
$path = rtrim($path, '/') . '/*';
$dirs = glob($path, GLOB_ONLYDIR);
$files = glob($path);
return array_unique(array_merge($dirs, $files));
}
$path = '/path/to/dir/';
readDir($path);
请注意,您不能对文件执行
glob('*.')
,因为它会拾取名为的文件夹,例如 我来晚了,但我喜欢用readdir()
而不是glob()
来提供我的解决方案。我在解决方案中缺少的是您的解决方案的递归版本。但是使用readdir比使用glob更快
因此,对于glob,它将如下所示:
function myglobdir($path, $level = 0) {
$dirs = glob($path.'/*', GLOB_ONLYDIR);
$files = glob($path.'/*');
$all2 = array_unique(array_merge($dirs, $files));
$filter = array($path.'/Thumbs.db');
$all = array_diff($all2,$filter);
foreach ($all as $target){
echo "$target<br />";
if(is_dir("$target")){
myglobdir($target, ($level+1));
}
}
}
函数myglobdir($path,$level=0){
$dirs=glob($path.'/*',glob_ONLYDIR);
$files=glob($path.'/*');
$all2=array_unique(array_merge($dirs,$files));
$filter=array($path.'/Thumbs.db');
$all=数组_diff($all2,$filter);
foreach(全部为$target){
回显“$target
”;
if(is_dir(“$target”)){
myglobdir($target,($level+1));
}
}
}
这个是readdir,但输出基本相同:
function myreaddir($target, $level = 0){
$ignore = array("cgi-bin", ".", "..", "Thumbs.db");
$dirs = array();
$files = array();
if(is_dir($target)){
if($dir = opendir($target)){
while (($file = readdir($dir)) !== false){
if(!in_array($file, $ignore)){
if(is_dir("$target/$file")){
array_push($dirs, "$target/$file");
}
else{
array_push($files, "$target/$file");
}
}
}
//Sort
sort($dirs);
sort($files);
$all = array_unique(array_merge($dirs, $files));
foreach ($all as $value){
echo "$value<br />";
if(is_dir($value)){
myreaddir($value, ($level+1));
}
}
}
closedir($dir);
}
}
函数myreaddir($target,$level=0){
$ignore=array(“cgi-bin”,“Thumbs.db”);
$dirs=array();
$files=array();
if(is_dir($target)){
如果($dir=opendir($target)){
while(($file=readdir($dir))!==false){
如果(!in_数组($file,$ignore)){
if(is_dir(“$target/$file”)){
数组_push($dirs,“$target/$file”);
}
否则{
数组_push($files,“$target/$file”);
}
}
}
//分类
排序($dirs);
排序($文件);
$all=array_unique(array_merge($dirs,$files));
foreach(全部为$value){
回显“$value”; if(is_dir($value)){ myreaddir($value,($level+1)); } } } closedir($dir); } }
我希望有人会觉得这个有用。请尝试一下。一个按文件和文件夹(目录)对PHP scandir结果排序的简单函数:
发布你自己发现的东西,然后我们可以告诉你是否可以改进。@alex-我不想浪费时间自己去发现,如果有一种更有效的方法,我会错过的。如果没有好的答案,我可以从手册中复制一些东西。我的解决方案已经编辑过了-你可能想编辑你的问题来反映这一点。@alex-是的,这是一个非常优雅的解决方案。你认为它与usort相比怎么样?@Steve只要你的文件系统按照你想要的顺序返回它们,它就会快得多。我实际上不做任何分类。对你有用吗?编辑做了一些编辑。让我知道它是否对你有效(在我的测试中对我有效)。@alex-稍作调整,现在完成。例如,
$filepath='path/to/dir/*'代码>。将在工作时更新问题和最终确定的代码。@alex为一个很棒的新函数干杯并+1,以前不知道blob
。@Steve我想你指的是glob。Blob什么也做不了。(虽然它应该)比上面的解决方案更好,它“在我的机器上不工作”:-。
function sort_dir_files($dir)
{
$sortedData = array();
foreach(scandir($dir) as $file)
{
if(is_file($dir.'/'.$file))
array_push($sortedData, $file);
else
array_unshift($sortedData, $file);
}
return $sortedData;
}