Php仅列出zip存档中的文件(排除文件夹) $za=new ZipArchive(); $za->open($source); 对于($i=0;$inumFiles;$i++){ $stat=$za->statidex($i); $items=array(basename($stat['name']).PHP\u EOL); foreach($items作为$item){ echo$项目; } }

Php仅列出zip存档中的文件(排除文件夹) $za=new ZipArchive(); $za->open($source); 对于($i=0;$inumFiles;$i++){ $stat=$za->statidex($i); $items=array(basename($stat['name']).PHP\u EOL); foreach($items作为$item){ echo$项目; } },php,arrays,Php,Arrays,此代码将列出zip存档中的所有文件,但我想排除列出的文件夹。如果数组中的项是文件夹,我希望将其从数组中排除,但仍希望列出文件夹中的文件。只是不要在列表中显示文件夹的名称 是否有一种方法可以检测该项是否是foreach循环中的目录(如何?),或者是否需要在阵列上运行搜索并查找文件夹,然后取消设置它(如何?) 谢谢你的帮助你的钱没用了。它使用一个项在数组上迭代 无论如何,有两种方法可以检测文件夹。首先,文件夹以“/”结尾。第二个文件夹的大小为0 $za = new ZipArchiv

此代码将列出zip存档中的所有文件,但我想排除列出的文件夹。如果数组中的项是文件夹,我希望将其从数组中排除,但仍希望列出文件夹中的文件。只是不要在列表中显示文件夹的名称

是否有一种方法可以检测该项是否是foreach循环中的目录(如何?),或者是否需要在阵列上运行搜索并查找文件夹,然后取消设置它(如何?)


谢谢你的帮助

你的钱没用了。它使用一个项在数组上迭代

无论如何,有两种方法可以检测文件夹。首先,文件夹以“/”结尾。第二个文件夹的大小为0

        $za = new ZipArchive();
        $za->open($source);
        for( $i = 0; $i < $za->numFiles; $i++ ){
            $stat = $za->statIndex( $i );
            $items = array( basename( $stat['name'] ) . PHP_EOL );
            foreach($items as $item) {
            echo $item;
            }
        }
$za=new ZipArchive();
$za->open('zip.zip');
$result_stats=array();
对于($i=0;$i<$za->numFiles;$i++)
{
$stat=$za->statidex($i);
如果($stat['size']))
$result_stats[]=$stat;
}
回波计数($result\u stats);

只需检查文件大小,如果为零,则为文件夹

$za = new ZipArchive();
$za->open('zip.zip');
$result_stats = array();
for ($i = 0; $i < $za->numFiles; $i++)
    {
    $stat = $za->statIndex($i);
    if ($stat['size'])
        $result_stats[] = $stat;
    }

echo count($result_stats);
$za=new ZipArchive();
$za->open('zip.zip');
对于($i=0;$i<$za->numFiles;$i++){
$stat=$za->statidex($i);
如果($stat['size']!=0){
echo$stat['name'];
}
}

目录有一个斜杠:

    $za = new ZipArchive(); 

    $za->open('zip.zip'); 

    for( $i = 0; $i < $za->numFiles; $i++ ){ 
        $stat = $za->statIndex( $i );
        if($stat['size']!=0){
            echo $stat['name'];
        }

    }
$za=new ZipArchive();
$za->open($source);
对于($i=0;$i<$za->numFiles;$i++){
$stat=$za->statidex($i);
if(substr($stat['name'],-1)!=='/')){
echo$stat['name'];
}
}

如果您正在寻找一个简单的PHP函数来列出文件和文件夹,但不列出子文件夹,下面是一个简单的精心编制的函数,您可以测试它是否适合您

$za = new ZipArchive();
$za->open($source);
for( $i = 0; $i < $za->numFiles; $i++ ){
    $stat = $za->statIndex( $i );
    if(substr($stat['name'], -1) !== '/'){
        echo $stat['name'];
    }
}
函数解压缩($path){
如果($path==null),则返回“未找到文件”;
$zip=新的ZipArchive();
$entryList='
    '; 如果($zip->open($path)==TRUE){ 对于($i=0;$i<$zip->numFiles;$i++){ //设置先决条件输入 $stat=$zip->statidex($i);//一组文件统计信息或详细信息 $filename=$stat['name'];//条目名称 $size=$stat['size'];//条目大小 //仅列出文件夹和文件名,但不列出子文件夹。 //当大小为零时,显示其文件夹、列表以及条目名称 //不包含(/),它是一个文件,请列出它。 $isFile=strstrstr($filename,“/”)==false; $anyFile=preg\u match(“/(\…+)$/”,$filename); $icon=($anyFile?'fa file text info':'fa folder text warning'); 如果($size==0 | |$isFile){ $filename=str_replace('/','$filename); $entryList.='
  • '; $entryList.=''; $entryList.=''.$filename.'
  • '; } } $zip->close(); } 返回$entryList。“
”; }
以下是输出:

我从未在PHP中使用过ZipArchive或任何与zip文件相关的东西,但这里有一个简单的例子。鉴于ZipArchive无法告诉您某个内容是文件还是目录,您可以在PHP中使用is_dir函数并使用if运行它。@CBroe,对不起,但是如果您想使用文件系统函数,您需要解压缩zip存档。谢谢!但是,有没有一种简单的方法可以将其从结果中删除,而不仅仅是不显示它?问题是,我还使用“echo$za->numFiles;”来显示打开归档文件后在归档文件中找到的文件数。如果找到一个文件夹名,我还想将其从计数中删除。谢谢你!“第二个文件夹的大小为0。”-也是文件夹,所以这不够精确。但你的第一种方法会奏效。getFromIndex()仅针对文件夹条目返回完整条目名称,末尾带有/(不考虑操作系统)。它应该是
=0
(不带引号),因为大小是以整数形式给出的。当然,它可以工作,但编码风格很差。尝试将
=
更改为
=
,它将不再工作,因为三个等号也会检查类型是否相等。但空文件不是文件夹。胡说八道。文件的大小可以为0,这是正确的,因为某些文件的大小可以为零。
function unzip($path){

  if($path ===  null ) return 'File not found.';
    $zip = new ZipArchive();

   $entryList  = '<ul class="list-group"> ';

   if ($zip->open($path) == TRUE) {
      for ($i = 0; $i < $zip->numFiles; $i++) {

       //set the prerequisit inputs
       $stat =  $zip->statIndex($i); //an array of file statistics or details
       $filename =  $stat['name']; // entry name
       $size =  $stat['size']; //entry size

       //list only folders and file names but not subfolders.
       //when size is zero,its folder, list it, and when entry name
       //doesn't contain the (/), its is a file, list it.

      $isFile  =  strstr($filename, '/') === false;
      $anyFile  = preg_match('/(\..+)$/',$filename);
      $icon = ($anyFile  ? 'fa-file text-info' : 'fa-folder text-warning' );
   
      if($size == 0 || $isFile  ){
          $filename = str_replace('/','',$filename);
          $entryList .='<li class="list-group-item  ">';
          $entryList .=  '<i class="fa '.$icon.' mr-1 "></i>';
          $entryList .='<button class="btn btn-link">'.$filename.'</button></li>';
    }
 }

   $zip->close();
  }

  return $entryList.'</ul>' ;

 }