2

我想从我的两级路径中获取所有 *.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";
    }
   }
 }
?>

谢谢

4

3 回答 3

2

您可以为此使用SplIteratorsRecursiveDirectoryIterator用于此:

// 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);
}
于 2013-04-24T21:22:19.690 回答
1

类似于您的原始代码的简单解决方案可能类似于:

$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";
          }
        }
      }
    }
  }
}
于 2013-04-24T21:48:49.080 回答
0

这可能意味着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();
于 2013-04-24T21:23:04.413 回答