2013-06-28 32 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; 
      } 
     } 

Mã này sẽ liệt kê tất cả các tệp trong kho lưu trữ zip nhưng tôi muốn loại trừ danh sách thư mục. Nếu mục trong mảng là một thư mục, tôi muốn loại trừ nó khỏi mảng BUT tôi vẫn muốn liệt kê các tệp trong thư mục. Chỉ cần không hiển thị tên của thư mục trong danh sách.Danh sách Php CHỈ các tệp trong kho lưu trữ zip (loại trừ các thư mục)

Có cách nào tôi có thể phát hiện nếu mục là một thư mục trong vòng lặp foreach của tôi (như thế nào?) Hoặc tôi cần chạy tìm kiếm trên mảng và tìm thư mục rồi bỏ đặt nó (như thế nào?)?

Cảm ơn sự giúp đỡ của bạn

+0

Tôi chưa bao giờ sử dụng ZipArchive hoặc bất kỳ thứ gì liên quan đến tệp zip trong PHP, nhưng đây là ảnh chụp trong bóng tối. Nhìn thấy như thế nào ZipArchive không có cách nào để nói cho bạn biết một cái gì đó là một tập tin hoặc thư mục, bạn có thể có thể sử dụng chức năng is_dir trong PHP và chạy nó với một nếu. –

+0

@CBroe, xin lỗi, nhưng nếu bạn muốn sử dụng các chức năng hệ thống tập tin, bạn cần giải nén lưu trữ zip. – sectus

Trả lời

2

Your foreach is useless. Nó lặp qua mảng với một mục.

Dù sao có hai cách để phát hiện thư mục. Đầu tiên, các thư mục được kết thúc bằng '/'. Thư mục thứ hai có kích thước 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

Cảm ơn! Nhưng có một cách dễ dàng để loại bỏ nó khỏi kết quả thay vì chỉ không hiển thị nó? Vấn đề là tôi cũng sử dụng "echo $ za-> numFiles;" để hiển thị số lượng tệp được tìm thấy trong kho lưu trữ sau khi mở tệp. Và nếu tìm thấy tên thư mục, tôi cũng muốn xóa nó khỏi số đếm. –

+0

Điều đó có dễ không? (xem câu trả lời cập nhật) – sectus

+0

Cảm ơn bạn sectus! "Thư mục thứ hai có kích thước 0". - Các thư mục cũng vậy, vì vậy đây không phải là đủ chính xác. Nhưng cách đầu tiên của bạn sẽ hoạt động. getFromIndex() trả về tên mục nhập đầy đủ với/(bất kể hệ điều hành) ở cuối chỉ cho các mục nhập thư mục. – StanE

0

Chỉ cần kiểm tra kích thước tệp, nếu không phải là thư mục.

$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

Nó phải là '! = 0' (không có dấu ngoặc kép) vì kích thước được cho là số nguyên. – ComFreek

+0

@ComFreek hoạt động cho tôi với dấu ngoặc kép – David

+0

Nó hoạt động, tất nhiên, nhưng nó là kiểu mã hóa kém. Hãy thử thay đổi '==' thành '===' và nó sẽ không hoạt động nữa vì ba dấu bằng nhau cũng kiểm tra tính bình đẳng của loại. – ComFreek

Các vấn đề liên quan