繁体   English   中英

PHP扫描目录和数组

[英]PHP scan directory and array

我有一个脚本,可以扫描文件夹并将包含的文件名放入数组中。 然后,我重新整理数组并显示文件名。

像这样:

$count=0;
$ar=array();
$i=1;
$g=scandir('./images/');

foreach($g as $x)
{
    if(is_dir($x))$ar[$x]=scandir($x);
    else 
    { 
        $count++;
        $ar[]=$x;   
    }
}
shuffle($ar);

while($i <= $count)
{
    echo $ar[$i-1];
    $i++;
}
?>

它运作良好,但由于某种原因,我得到了以下信息:

  • fff.jpg
  • ccc.jpg
  • 排列
  • nnn.jpg
  • ttt.jpg
  • sss.jpg
  • bbb.jpg
  • 排列
  • eee.jpg

当然,由于我进行了随机播放,因此刷新页面时顺序发生了变化,但是在200个文件名中,我总是在列表中的某个位置找到这2个“数组”。

会是什么呢?

谢谢

只是为了解释它给您Array那一部分。

首先, scandir返回以下内容:

从目录返回文件和目录的数组。

从该返回值中,它返回了这个(这是一个示例,仅供参考):

Array
(
    [0] => . // current directory
    [1] => .. // parent directory
    [2] => imgo.jpg
    [3] => logo.png
    [4] => picture1.png
    [5] => picture2.png
    [6] => picture3.png
    [7] => picture4.png
)

那些点实际上是文件夹。 现在在您的代码逻辑中,当点击/迭代该位置时:

if(is_dir($x))$ar[$x]=scandir($x); // if its a directory
// invoke another set of scandir into this directory, then append it into the array

这就是为什么您的结果数组包含混合字符串,而另一个多余/不需要的scandir数组返回..

为了避免这种情况,可以使用肮脏的快速修复程序。 只是跳过点:

foreach($g as $x)
{
    // skip the dots
    if(in_array($x, array('..', '.'))) continue;
    if(is_dir($x))$ar[$x]=scandir($x);
    else
    {
        $count++;
        $ar[]=$x;
    }
}

另一种选择是使用DirectoryIterator

$path = './images/';
$files = new DirectoryIterator($path);
$ar = array();
foreach($files as $file) {
    if(!$file->isDot()) {
        // if its not a directory
        $ar[] = $file->getFilename();
    }
}

echo '<pre>', print_r($ar, 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM