28

我有一个从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"
}

我将如何从数组中删除"."and ?".."

4

7 回答 7

43

您可以使用array_filter

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

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

$indir = array_filter(scandir('../pages'), function($item) {
    return $item[0] !== '.';
});
于 2013-02-04T04:00:38.783 回答
27

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

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

来自PHP 手册

于 2015-02-28T14:21:49.053 回答
9

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

于 2013-02-04T04:00:17.287 回答
3

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

$dirPath = 'dashboard';

$dir = scandir($dirPath);

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

$dir = array_values($dir);
于 2017-03-10T15:03:15.613 回答
0

您可以使用此代码段。它只返回目录中的文件:

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>";
于 2016-11-09T13:14:37.640 回答
0

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

$files = array(".", "..", "html", ".~html", "shtml");    
$newfiles = preg_grep('/^([^.])/', scandir($files));
于 2017-09-22T06:01:49.660 回答
0

如果你需要一个干净的功能;

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

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

于 2021-10-14T10:27:15.370 回答