scandir()通过增加数字进行扫描


scandir() scan by increasing number

我想扫描一个目录,并将所有文件名按升序(数字,无字母)添加到数组中。似乎正在发生的是scandir()按照第一个数字的最高值而不是整个数字对它们进行排序。我需要考虑丢失的文本文件,所以如果9.txt丢失,10.txt将取代它(数组中没有空位)。

这是代码:

<?php
$array=array();
$int = 1;
$holder=scandir("/postexamples/");
krsort($holder);
foreach($holder as $x)
{
    if(!is_dir($x)){
    $array[$int]=$x;
    $int++;
    }
}
echo PHP_EOL . PHP_EOL . "Final array: " , PHP_EOL;
print_r($array);
?>

哪个输出数组:

Array ( [1] => 9.txt [2] => 8.txt [3] => 7.txt [4] => 6.txt [5] => 5.txt [6] => 4.txt [7] => 3.txt [8] => 20.txt [9] => 2.txt [10] => 19.txt [11] => 18.txt [12] => 17.txt [13] => 16.txt [14] => 15.txt [15] => 14.txt [16] => 13.txt [17] => 12.txt [18] => 11.txt [19] => 10.txt [20] => 1.txt )

有没有更好的(最好是有效的)方法来做到这一点?我需要它像[1] => 1.txt [2] => 2.txt

编辑:

我需要数组显示如下:

Array ( [1] => 1.txt [2] => 2.txt [3] => 3.txt [4] => 4.txt [5] => 5.txt [6] => 6.txt [7] => 7.txt [8] => 8.txt [9] => 9.txt [10] => 10.txt [11] => 11.txt [12] => 12.txt [13] => 13.txt [14] => 14.txt [15] => 15.txt [16] => 16.txt [17] => 17.txt [18] => 18.txt [19] => 19.txt [20] => 20.txt )

如果缺少一个文件(例如,17.txt),它将如下所示:

Array ( [1] => 1.txt [2] => 2.txt [3] => 3.txt [4] => 4.txt [5] => 5.txt [6] => 6.txt [7] => 7.txt [8] => 8.txt [9] => 9.txt [10] => 10.txt [11] => 11.txt [12] => 12.txt [13] => 13.txt [14] => 14.txt [15] => 15.txt [16] => 16.txt [17] => 18.txt [18] => 19.txt [19] => 20.txt )

您需要进行自然排序,以获得正确顺序的文件(20.txt,10.txt,2.txt,1.txt)。执行此操作的函数是natsort。

$sortPath = 'postexamples/';
$files = array();
foreach (scandir($sortPath) as $file) {
    if (is_file("$sortPath/$file")) {
        $files[] = $file;
    }
}
echo PHP_EOL . PHP_EOL . "Final array: " , PHP_EOL;
natsort($files);
$files = array_values($files);  // re-key array
print_r($files);

结果

Final array:
Array
(
    [0] => 1.txt
    [1] => 2.txt
    [2] => 4.txt
    [3] => 10.txt
    [4] => 20.txt
)
我是这样做的。
   $files = array_diff(scandir("/postexamples/"), array('.', '..' ));
   $array = array();
   foreach($files as $file){
        if(!is_dir($file)){
            $array[]=$file;
        }
   }
   sort($array, SORT_NUMERIC);

如果usort不能正确计算数字,你可能不得不使用它。此外,如果你在php>=5.4上,你可能可以使用,

scandir("/postexamples/", SCANDIR_SORT_ASCENDING );

但我还没有尝试过。使用带数字标志的排序(别忘了它和其他任何数组一样只是一个数组)

$a = Array ( '9.txt', '8.txt', '7.txt', '6.txt', '10.txt', '1.txt');
echo "<pre>";
var_export($a);
echo "<br>";
sort($a, SORT_NUMERIC);
var_export($a);

结果

array (
  0 => '9.txt',
  1 => '8.txt',
  2 => '7.txt',
  3 => '6.txt',
  4 => '10.txt',
  5 => '1.txt',
)
array (
  0 => '1.txt',
  1 => '6.txt',
  2 => '7.txt',
  3 => '8.txt',
  4 => '9.txt',
  5 => '10.txt',
)

所以本质上sort($a, SORT_NUMERIC);

试试这个,我希望它能帮助你:

$ar=array();
$g=scandir("/postexamples/");
krsort($g)
foreach($g as $x)
{
    if(is_dir($x))$ar[$x]=scandir($x);
    else $ar[]=$x;
}
print_r(sort($ar));