我有一个脚本扫描文件夹,并在其中包含它包含的文件名。 然后我将数组洗牌并显示文件名。
像这样:
$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++;
}
?>
它运作良好,但出于某种原因我得到这样的东西:
当然,当我刷新页面时,由于我的洗牌,订单会改变,但在200个文件名中,我总是得到这些2&#34;数组&#34;列表中的某个地方。
它可能是什么?
谢谢
答案 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);