如何检查某物是PHP中数组中的文件还是目录?

时间:2019-04-08 11:48:25

标签: php arrays function directory

我正在尝试过滤掉此数组中的一些文件夹:

Array
(
    [2] => 20151113_152308.jpg
    [3] => 20160524_173033.jpg
    [4] => 20160810_100405.jpg
    [5] => 20160816_142932.jpg
    [6] => 20160817_135507.jpg
    [7] => 20170203_145901.jpg
    [8] => 20170203_151235.jpg
    [9] => Afbeelding-ifone-131.jpg
    [10] => Afbeelding-ifone-508.jpg
    [11] => Bestratingswerkzaamheden
    [12] => Mvc-161.jpg
    [13] => Rioleringswerkzaamheden
    [14] => SANY0016.jpg
    [15] => SANY0036.jpg
    [16] => SANY0060.jpg
    [17] => SANY0132.jpg
    [18] => SANY0133.jpg
    [19] => SANY0158.jpg
    [20] => SANY0159.jpg
    [21] => SANY0361.jpg
    [22] => Zeefwerkzaamheden
)

您可以看到数组中有文件,但也有一些文件夹(无扩展名)。我尝试使用is_dir()过滤掉它们。

使用以下代码:

<?PHP
//Base path
$pad = "/home/studione/public_html/_extern/website/cms/images/beeldbank/".$alias."";
//Get everything from above path
$directories = array_diff(scandir($pad), array('.', '..', 'index.html'));
// Print array of above
echo '<pre>';
print_r($directories);
echo '</pre>';

foreach($directories as $image){

  if(!is_dir($image){
      $impressieslider .= '
      <div class="col-md-3">
        <a class="impressiegallerij" href="cms/images/beeldbank/'.$alias.'/'.$image.'">
          '.$directory.'
          <img src="cms/images/beeldbank/'.$alias.'/'.$image.'" class="d-block img-fluid gallerypageimg" alt="">
        </a>
      </div>';
  }
}
echo impressieslider;
?>

但是我仍然在页面上看到文件夹,为什么?每当数组到达文件夹时,我也尝试在循环内回显字符串,但是我什么也没看到。我在做什么错了?

3 个答案:

答案 0 :(得分:1)

有一个简单的函数可以检查PHP中是否有目录:is_dir()函数(https://www.php.net/manual/de/function.is-dir.php)。

这是一个简单的解决方案:

$path = ''; // must be the path to the directory you want to check

$files_only = array_filter($directories, function($file_or_directory) use ($path) {
  // make sure you have the correct full path here with the realpath() function
  if(!is_dir(realpath($path . DIRECTORY_SEPERATOR . $file_or_directory))) {
    return true;
  }
  return false;
});

如果您只想通过命名来进行过滤,那是不可能的,因为其中有些文件没有扩展名,而目录名中带有点。如果无法访问此目录,则无法确定是否仅滤除正确的内容。

答案 1 :(得分:0)

这是您可以做的事情。 (但这不是一个完美的解决方案,如果您的目录包含(。)字符,它将无法正常工作)

foreach($directories as $image){
   $is_file = explode('.', $image);
  if(count($is_file) > 1 ) { //you can check either this file exist or not.
      $impressieslider .= '
      <div class="col-md-3">
        <a class="impressiegallerij" href="cms/images/beeldbank/'.$alias.'/'.$image.'">
          '.$directory.'
          <img src="cms/images/beeldbank/'.$alias.'/'.$image.'" class="d-block img-fluid gallerypageimg" alt="">
        </a>
      </div>';
  }
}
echo impressieslider;

答案 2 :(得分:0)

您可以通过简单的方式完成

$dirPath = 'path/to/images/';
foreach(glob($dirPath.'*.{jpg,JPG,jpeg,JPEG,png,PNG}',GLOB_BRACE) as $file){
   $imgs[] =  basename($file);
}