Is there a way to glob() only files?

后端 未结 5 1355
逝去的感伤
逝去的感伤 2020-12-30 21:34

I know that glob can look for all files or only all directories inside a folder :

echo \"All files:\\n\";
$all = glob(\"/*\");
var_dump($all);

echo \"Only d         


        
相关标签:
5条回答
  • 2020-12-30 21:39
    $all = glob("/*.*");
    

    this will list everything with a "." after the file name. so basically, all files.

    0 讨论(0)
  • 2020-12-30 21:43

    10% faster compared to the solution of @AlainTiemblo :

    $files = array_filter(glob("/*", GLOB_MARK), function($path){ return $path[ strlen($path) - 1 ] != '/'; });
    

    It uses GLOB_MARK to add a slash to each directory and by that we are able to remove those entries through array_filter() and an anonymous function.

    Since PHP 7.1.0 supports Negative numeric indices you can use this instead, too:

    $files = array_filter(glob("/*", GLOB_MARK), function($path){return $path[-1] != '/';});
    

    No relevant speed gain, but it helps avoiding the stackoverflow scrollbar ^^

    As array_filter() preserve the keys you should consider re-indexing the array with array_values() afterwards:

    $files = array_values($files);
    
    0 讨论(0)
  • 2020-12-30 21:48

    You can use GLOB_BRACE to match documents against a list of known file extensions:

    $files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);
    

    see: http://www.electrictoolbox.com/php-glob-find-files/

    0 讨论(0)
  • 2020-12-30 21:55

    There is an easier way, just one line:

    $files = glob("/path/to/directory/*.{*}", GLOB_BRACE);
    

    the {*} means all file endings, so every file, but no folder!

    0 讨论(0)
  • 2020-12-30 21:57

    I finally found a solution :

    echo "Only files\n";
    $files = array_filter(glob("/*"), 'is_file');
    var_dump($files);
    

    But take care, array_filter will preserve numeric keys : use array_values if you need to reindex the array.

    0 讨论(0)
提交回复
热议问题