PHP扫描目录和数组

时间:2015-05-13 23:39:22

标签: php arrays directory

我有一个脚本扫描文件夹,并在其中包含它包含的文件名。 然后我将数组洗牌并显示文件名。

像这样:

$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&#34;数组&#34;列表中的某个地方。

它可能是什么?

谢谢

1 个答案:

答案 0 :(得分:4)

只是解释它为您提供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);