2013-06-28 2 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 list ТОЛЬКО файлы внутри zip-архива (исключить папки)

Есть ли способ определить, является ли элемент каталогом в моем цикле foreach (как?), Или мне нужно запустить поиск в массиве и искать папки, а затем отменить его (как?)?

Спасибо за вашу помощь

+0

Я никогда не использовал ZipArchive или что-либо, связанное с zip-файлами на PHP, но вот выстрел в темноте. Увидев, как ZipArchive не может сказать вам, что-то является файлом или каталогом, вы можете использовать функцию is_dir в PHP и запустить ее с 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

Спасибо, секта! «Вторые папки имеют размер 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