【问题标题】:How to check if something is a file or a directory within an array in PHP?如何检查某个东西是PHP数组中的文件还是目录?
【发布时间】:2019-04-08 11:48:24
【问题描述】:

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

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;
?>

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

【问题讨论】:

  • “但我仍然在我的页面上看到文件夹,为什么?” - 因为您当时忽略了文件路径?
  • 也许:if(!is_dir($image) ) {
  • 从哪里获得 '.$directory.' 的价值?
  • if(is_dir($pad.'/'.$image) == false) 尝试运行这个条件

标签: php arrays function directory


【解决方案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;
});

并不是说,如果您只想通过命名进行过滤,这是不可能的,因为有些文件没有扩展名,而目录名称中包含点。如果无法访问此目录,则无法确定是否仅过滤掉了正确的内容。

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      【解决方案3】:

      你可以通过简单的方式做到这一点

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-24
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多