PHP对相对于路径的目录列表进行排序(?)

时间:2018-03-26 00:07:00

标签: php file sorting

我遇到了问题,我不知道如何描述它,所以我会直接看到代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

他收到的内容如下:

C:\ XAMPP \ htdocs中\包括\测试\ aa.txt文件
C:\ XAMPP \ htdocs中\包括\测试\ cc.txt
C:\ XAMPP \ htdocs中\包括\测试\ ccc.txt
C:\ XAMPP \ htdocs中\包括\测试\ file.txt的
C:\ XAMPP \ htdocs中\包括\测试\ test.php的
C:\ XAMPP \ htdocs中\包括\测试\ test2.php
C:\ XAMPP \ htdocs中\的index.php
C:\ XAMPP \ htdocs中\ file.txt的
C:\ XAMPP \ htdocs中\ sth.txt

我希望收到类似的内容:

C:\ XAMPP \ htdocs中\ file.txt的
C:\ XAMPP \ htdocs中\的index.php
C:\ XAMPP \ htdocs中\ sth.txt
C:\ XAMPP \ htdocs中\包括\测试\ aa.txt文件
C:\ XAMPP \ htdocs中\包括\测试\ cc.txt
C:\ XAMPP \ htdocs中\包括\测试\ ccc.txt
C:\ XAMPP \ htdocs中\包括\测试\ file.txt的
C:\ XAMPP \ htdocs中\包括\测试\ test.php的
C:\ XAMPP \ htdocs中\包括\测试\ test2.php

我怎么能收到这样的东西?提前感谢您的每一个答案。

2 个答案:

答案 0 :(得分:1)

从@Ghost略微改进版本以关注子结构内的排序:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
$files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');
$data = array();
foreach($iterator as $file) {
    $depth = $files->getDepth(); // get depth
    $data[$depth][] = $file->getRealpath(); // push depth inside another dimension with the file
}

// this is necessary that items within the depth are sorted correctly, first sort by key (the depth) than sort by name
ksort($data);
foreach ($data as $depthArray){
    sort($depthArray);
}

$data = call_user_func_array('array_merge', $data); // flatten all items
// use data

当目录包含许多子目录时,这仍然会有问题。这个例子:

a\b.html
downtheway\a.html
a\a.html
a\sub1\c.sorted

会像这样解决:

a\b.html
a\a.html
downtheway\a.html // wrong
a\sub1\c.html

因为算法只考虑了深度和

a\sub1\c.html

更深
downtheway\a.html

@Trawlr:这对您的用例是否正确,或者应该像这样排序:

a\b.html
a\a.html
a\sub1\c.html
downtheway\a.html

旧答案并不是OP所要求的。

仅对数组使用常规sort。这应该没有问题。

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
$files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');

$array = array();
foreach($files as $file){
    $array[] = $file->getRealpath();
}
sort($array, SORT_STRING);
//output array

您还可以将SORT_STRINGSORT_FLAG_CASE结合使用,以忽略字符串的大小写。看起来像这样:

sort($array, SORT_STRING | SORT_FLAG_CASE );

答案 1 :(得分:1)

如果我正确理解您的问题,您希望按文件的深度对它们进行排序,您可以使用->getDepth方法获取当前深度,并将它们分配给文件的每个组。首先将它们分组,最后只需将它们合并,你们就可以将它们排成一行。

以下是这个想法:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
$files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');
$data = array();
foreach($iterator as $file) {
    $depth = $files->getDepth(); // get depth
    $data[$depth][] = $file->getRealpath(); // push depth inside another dimension with the file
}

$data = call_user_func_array('array_merge', $data); // flatten all items