php 是否在scandir数组中包含JUST文件?

kjthegm6  于 2023-01-08  发布在  PHP
关注(0)|答案(9)|浏览(103)

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

如何从阵列中删除"."".."

ryoqjall

ryoqjall1#

您可以使用array_filter

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

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

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

gojuced72#

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

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

PHP Manual

zd287kbt

zd287kbt3#

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

jhdbpxl9

jhdbpxl94#

我知道erknrio提供了一个答案,但这里有一个更干净的方法来获得一个没有目录的文件数组(修改后更有效):

$dirPath = 'dashboard';

$dir = scandir($dirPath);

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

$dir = array_values($dir);
2j4z5cfb

2j4z5cfb5#

你可以使用这个代码段。它只返回目录中的文件:

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>";
jgovgodb

jgovgodb6#

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

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

jmp7cifd7#

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

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

我认为这个函数既整洁又能很好地工作。而且,这个函数中返回的数组的键排序正确。

ercv8c1e

ercv8c1e8#

所有其他答案都是好的。我有一个干净的变通方案。
使用glob函数,该函数接受一个正则表达式,只返回匹配的文件。它似乎排除了...目录,因此使用一个简单的

$indir = glob('../pages/*');

应该很好用。

pieyvz9o

pieyvz9o9#

function dscan( $path ){
     global $dfiles;
     if( !isset( $dfiles ) ){
       $dfiles = array();
     }
     $files = preg_grep('/^.*\.php$/i', scandir($path));
     foreach( $files as $file ){
       if( !in_array( "$path/$file",$dfiles ) ){
         $dfiles[] = array( 'path' => "$path/$file", 'name' => $file );
       }
     }
     return $dfiles;
   }
   dscan( $path );
   print_r( $dfiles );

相关问题