【问题标题】:PHP scan directory and arrayPHP扫描目录和数组
【发布时间】:2015-07-25 11:00:01
【问题描述】:

我有一个脚本可以扫描文件夹并将其包含的文件名放入一个数组中。 然后我打乱数组并显示文件名。

像这样:

$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 个“数组”。

会是什么?

谢谢

【问题讨论】:

  • glob() 更有趣
  • @Dagon blob blob 我认为那是鱼 :) 你是说 glob 吗?
  • 我会寻找 glob,谢谢。同时,我想知道脚本(第一个)出了什么问题。在我的示例中,我只是“回显”文件名以使其简单,但我需要的不仅仅是这些。所以我需要将名称存储在一个数组中以备后用。我相信,无论是否是 glob,我最终都会遇到完全相同的问题。
  • 如果您需要递归搜索目录,您也可以使用 SPL 库 stackoverflow.com/questions/20045622/…
  • @Baylock ./images/ 仅包含图像,还是包含子文件夹?您是否也需要查看其子文件夹中的图像?

标签: php arrays directory


【解决方案1】:

只是为了解释它给你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);

【讨论】:

  • 非常感谢。而已。其他贡献者的建议可能是正确的,但我需要知道这里发生了什么,你的回答完全有意义。
  • @Baylock 很高兴这能有所启发
  • @l'l'l 是的,当然glob 会很酷而且很灵活,因为它甚至可以支持通配符和其他东西,当然不会造成任何伤害。
  • @Ghost: Here's what I was thinking - 如果您认为它有帮助,请随时将其添加到您的答案中,干杯:)
  • 别自欺欺人;给自己更多的信任。我以为你给了他们一个很好的解释;-)
猜你喜欢
  • 2011-05-05
  • 2011-10-14
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多