2013-06-28 67 views
6
 $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; 
      } 
     } 

此代碼將列出zip歸檔文件中的所有文件,但我想排除文件夾列表。如果數組中的項目是一個文件夾,我想從數組中排除它,但我仍然想列出文件夾內的文件。只是不要在列表中顯示文件夾的名稱。PHP列表只包含zip文件內的文件(不包括文件夾)

有沒有一種方法可以檢測項目是否在我的foreach循環中的目錄(如何?)或者我需要在數組上運行搜索並查找文件夾,然後取消設置(如何?)?

感謝您的幫助

+0

我從來沒有使用ZipArchive或任何與PHP中的zip文件相關的東西,但這裏是黑暗中的鏡頭。看到ZipArchive無法告訴你某些東西是文件還是目錄,你可能可以在PHP中使用is_dir函數並使用if運行它。 –

+0

@CBroe,很抱歉,如果您想使用文件系統功能,您需要提取zip壓縮文件。 – sectus

回答

2

您的foreach是無用的。它迭代一個項目的數組。

無論如何有兩種方法來檢測文件夾。首先,文件夾以'/'結尾。第二個文件夾的大小爲0。

$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); 
+0

謝謝!但是有沒有簡單的方法將其從結果中刪除,而不是隻顯示它?問題是我也使用「echo $ za-> numFiles;」在打開文件後顯示存檔中找到的文件數量。如果找到文件夾名稱,我也想從計數中刪除它。 –

+0

這很容易嗎? (查看更新回答) – sectus

+0

謝謝sectus! 「第二個文件夾的大小爲0」。 - 文件夾也是如此,所以這不夠精確。但你的第一種方式將起作用。 getFromIndex()僅在文件夾條目結束時返回帶有/(不管操作系統)的完整條目名稱。 – StanE

0

只要檢查文件大小,如果它是零它是一個文件夾。

$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']; 
     } 

    } 
+0

它應該是'!= 0'(不帶引號),因爲大小是以整數形式給出的。 – ComFreek

+0

@ComFreek當然適合我的報價 – David

+0

它的工作原理當然不過是糟糕的編碼風格。嘗試將'=='更改爲'===',並且它不再工作,因爲三個等號也會檢查類型是否相等。 – ComFreek