[英]Get all zip files from two-levels path in php
我想从我的两级路径中获取所有* .zip文件,我做了两个while循环和foreach循环。 一直以来,我在使用“ array_filter()[function.array-filter]:第一个参数应为数组”之类的数组时遇到一些错误。 有人可以帮忙吗?
<?php
$dirs = array_filter(glob('*'), 'is_dir');
while (list($key, $value) = each($dirs)) {
$dirs_2 = array_filter(glob($value.'/*'), 'is_dir');
while (list($key_2, $value_2) = each($dirs_2)) {
foreach (array_filter(glob($value_2."/*.zip")) as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
}
}
?>
谢谢
您可以为此使用SplIterators 。 RecursiveDirectoryIterator
用于以下目的:
// create recursive directory iterator for zip folder
$directory_iterator = new RecursiveDirectoryIterator('/path/to/zip/files');´
// required to iterate through results using foreach
$recusive_iterator = new RecursiveIteratorIterator($directory_iterator);
// filter only .zip files
$regex_iterator = new RegexIterator($recursive_iterator, '/^.*\.zip$/',
RegexIterator::GET_MATCH);
// iterate through results
foreach($regex_iterator as $file_info) {
var_dump($file_info);
}
一个类似于原始代码的简单解决方案可能类似于:
$dirs = scandir('.');
foreach ($dirs as $dir) {
if (is_dir($dir) && !preg_match('/^\.\.?$/', $dir)) {
$dirs2 = scandir($dir);
foreach ($dirs2 as $dir2) {
if (is_dir($dir . '/' . $dir2) && !preg_match('/^\.\.?$/', $dir2)) {
$files = scandir($dir . '/' . $dir2);
foreach ($files as $file) {
if (preg_match('/.+\.zip$/', $file)) {
echo $file . "\n";
}
}
}
}
}
}
这可能意味着glob()
返回的false
表示发生了错误,您可以通过检查是否返回false来跳过该错误,在这种情况下,请提供一个空数组,这样您的代码就可以正常工作,就像替换下面的代码一样:
$dirs_2 = array_filter(glob($value.'/*'), 'is_dir');
为此:
$dirs_2 = array_filter(glob($value.'/*') || array(), 'is_dir');
附带说明一下,您可以完全跳过所有array_filter,因为可以传递glob()一个参数,使其仅返回目录条目,它是GLOB_ONLYDIR
标志,因此可以替换以下代码:
$dirs = array_filter(glob('*'), 'is_dir');
为此:
$dirs = glob('*', GLOB_ONLYDIR) || array();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.