数组:如何通过自然顺序排序来获取文件位置?

时间:2019-03-15 15:32:24

标签: php arrays sorting for-loop

我想按自然顺序对位于文件夹中的文件进行排序。 这些文件是:“ 1-Test1.docx”,“ 2-Test2.docx”,“ 3-Test3.docx”,“ 10-Test10.docx”。

当我使用以下内容时:

for( $i= 0 ; $i <= 4; $i++ ){
    $nomfichier = glob("vendor/templates/part3/*.docx");
    natsort ($nomfichier);
    print_r ($nomfichier);
}

我有:

Array ( [0] => folder1/folder2/1-Test1.docx [2] => folder1/folder2/2-Test2.docx [3] => folder1/folder2/1-Test3.docx [1] => folder1/folder2/10-Test10.docx ) 

没关系。但是,当我尝试使用相同的自然顺序回显每个位置时,它在“ 1-Test1.docx”之后给出了“ 10-Test10.docx”。

    $position = array_search($nomfichier[$i], $nomfichier);
   // echo $nomfichier[$i]. " : ". $position;

给予...

folder1/folder2/1-Test1.docx : 0 folder1/folder2/10-Test10.docx : 1 folder1/folder2/2-Test2.docx : 2 folder1/folder2/3-Test3.docx : 3 

我想得到以下结果:

folder1/folder2/1-Test1.docx : 0 folder1/folder2/2-Test2.docx : 1 folder1/folder2/3-Test3.docx : 2 folder1/folder2/10-Test10.docx : 3 

我该怎么做才能使其正常工作?

谢谢!!

2 个答案:

答案 0 :(得分:1)

natsort对数组进行排序时发生,但是键保持不变。因此,当您打印0索引值时,它将打印10-Test10.docx。要正确实现此目的,可以将array_multisortSORT_NATURAL标志一起使用,如下所示:

for( $i= 0 ; $i <= 4; $i++ ){
    $nomfichier = glob("uploads/*.jpeg");
    array_multisort($nomfichier, SORT_NATURAL);
    $position = array_search($nomfichier[$i], $nomfichier);
    echo $nomfichier[$i]. " : ". $position;
}

希望它对您有帮助。

答案 1 :(得分:1)

由于您使用的是for循环,因此索引将覆盖排序。
当您进行循环并回显$ arr [1]时,无论排序显示什么,它仍然是数组中的项目1。

另一方面,Foreach不会循环索引并遵守排序顺序。

// Your array
$arr = array (
  0 => 'folder1/folder2/1-Test1.docx ',
  2 => 'folder1/folder2/2-Test2.docx ',
  3 => 'folder1/folder2/1-Test3.docx ',
  1 => 'folder1/folder2/10-Test10.docx ',
);

foreach($arr as $val){
    echo $val . PHP_EOL;
}

输出:

folder1/folder2/1-Test1.docx 
folder1/folder2/2-Test2.docx 
folder1/folder2/1-Test3.docx 
folder1/folder2/10-Test10.docx 

https://3v4l.org/J3SkA

如果出于任何原因需要知道索引键值,则可以使用foreach($arr as $key => $val){,而$ key将成为数组的索引。