【问题标题】:Include JUST files in scandir array?在 scandir 数组中包含 JUST 文件?
【发布时间】:2013-01-18 18:17:05
【问题描述】:

我有一个从 scandir 返回的数组,但它包含 ".""..",我不想要它。

我的代码:

$indir = scandir('../pages');
$fileextensions = array(".", "php", "html", "htm", "shtml");
$replaceextensions = str_replace($fileextensions, "", $indir);

我正在对文件扩展名进行字符串替换,从而导致 [0] 和 [1] 显示为空,但它们是 "."".."

array(4) {
[0]=>
string(0) ""
[1]=>
string(0) ""
[2]=>
string(4) "test"
[3]=>
string(4) "home"
}

如何从数组中删除 "."".."

【问题讨论】:

标签: php scandir


【解决方案1】:

您可以使用array_filter

$indir = array_filter(scandir('../pages'), function($item) {
    return !is_dir('../pages/' . $item);
});

请注意,这会过滤掉所有目录,只留下文件和符号链接。如果您真的只想排除以. 开头的文件(和目录),那么您可以执行以下操作:

$indir = array_filter(scandir('../pages'), function($item) {
    return $item[0] !== '.';
});

【讨论】:

  • 太棒了。完美的解释。非常感谢。
  • 不要使用带有回调的array_filter,只需使用array_diff
  • @ArnoldDaniels 这只能完全删除 ...,我的解决方案更加通用,array_diff() 也无法完成
  • @leftclickben 删除 ... 正是他的问题。
  • 仅仅因为初级程序员认为他们只是在寻找...,根据我的经验,这种情况很少发生。问题表明他正在将文件名放入数据库。因此我的第一个答案是过滤掉目录,其中包括...
【解决方案2】:

在scandir中将点作为文件删除的最快方法

$files = array_slice(scandir('/path/to/directory/'), 2); 

来自PHP Manual

【讨论】:

  • 这正是我想要的。简单直接。这应该被视为最佳答案
  • 是的,似乎是最好的方法,似乎应该有一个内置的 scan_dir 过滤器。看起来很简单。我可能是错的。
  • 取自 PHP 站点本身的 comment:有人写道,array_slice 可用于快速删除目录条目“。”和 ”..”。但是,“-”是一个有效的条目,会出现在这些条目之前,因此 array_slice 会删除错误的条目。
  • 从未在我的目录中看到“-”。我认为在大多数情况下这会很好。
  • 如果您的条目中有前缀“#”或“-”,则此解决方案不起作用,因为它们位于点条目之前。
【解决方案3】:

array_diff 将满足您的需求:

$indir = scandir('../pages');
$fileextensions = array(".", "php", "html", "htm", "shtml");
$indir = array_diff($indir, array('.', '..'));
$replaceextensions = str_replace($fileextensions, "", $indir);

http://php.net/manual/en/function.array-diff.php

【讨论】:

    【解决方案4】:

    我知道 erknrio 对此提供了答案,但这是获取不带目录的文件数组的一种更简洁的方法(修改为更有效):

    $dirPath = 'dashboard';
    
    $dir = scandir($dirPath);
    
    foreach($dir as $index => &$item)
    {
        if(is_dir($dirPath. '/' . $item))
        {
            unset($dir[$index]);
        }
    }
    
    $dir = array_values($dir);
    

    【讨论】:

    • &$item 应该是$item
    • @DanBray 为什么?
    • 你永远不会修改$item,所以引用它是没有意义的,除非你将unset($dir[$index])更改为unset($item])
    • @DanBray 这是一个微优化。
    【解决方案5】:

    你可以使用这个sn-p。它只返回目录中的文件:

    function only_files($dir_element) {
        if (!is_dir($dir_element)) {
            return $dir_element;
        }
    }
    
    function givemefiles($dir) {
        $scanned_dir = scandir($dir);
        return array_filter($scanned_dir, "only_files");
    }
    
    $dir_path = '../pages';
    
    givemefiles($dir_path);
    echo "<pre>";
    var_dump($scanned_dir);
    echo "</pre>";
    

    【讨论】:

      【解决方案6】:

      只需使用 preg_replace 从目录中删除所有类型的隐藏文件

      $files = array(".", "..", "html", ".~html", "shtml");    
      $newfiles = preg_grep('/^([^.])/', scandir($files));
      

      【讨论】:

        【解决方案7】:

        如果你需要一个干净的函数;

        function getFiles($dir){
            return array_values(array_filter(scandir($dir), function($file){
                global $dir;
                return !is_dir("{$dir}/{$file}");
            }));
        }
        

        我认为这个功能既简洁又好用。 此外,此函数中返回的数组的键排序正确。

        【讨论】:

          猜你喜欢
          • 2016-07-22
          • 2013-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 2015-07-20
          • 2020-02-05
          相关资源
          最近更新 更多