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

Questo codice elencherà tutti i file all'interno di un archivio zip ma voglio escludere l'elenco delle cartelle. Se l'elemento nell'array è una cartella, voglio escluderlo dall'array MA voglio comunque elencare i file all'interno della cartella. Basta non visualizzare il nome della cartella nell'elenco.Elenco php SOLO file all'interno dell'archivio zip (escludere cartelle)

C'è un modo per rilevare se l'elemento è una directory nel mio ciclo foreach (come?) O devo eseguire una ricerca sull'array e cercare le cartelle e quindi annullarlo (come?)?

Grazie per il vostro aiuto

+0

Non ho mai usato ZipArchive o qualsiasi cosa relativa ai file zip in PHP, ma ecco uno scatto al buio. Visto che ZipArchive non ha modo di dirti se qualcosa è un file o una directory, potresti essere in grado di usare la funzione is_dir in PHP ed eseguirla con un if. –

+0

@CBroe, scusa, ma se vuoi usare le funzioni del filesystem devi estrarre l'archivio zip. – sectus

risposta

2

Il vostro foreach è inutile. It ita su array con un elemento.

In ogni caso c'è un modo per rilevare la cartella. Innanzitutto, le cartelle sono terminate con '/'. Le seconde cartelle hanno dimensione 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

Grazie! Ma esiste un modo semplice per rimuoverlo dai risultati anziché semplicemente non visualizzarlo? Il problema è che uso anche "echo $ za-> numFiles;" per visualizzare il numero di file trovati nell'archivio dopo averlo aperto. E se viene trovato un nome di cartella, voglio anche rimuoverlo dal conteggio. –

+0

È facile? (vedi la risposta all'aggiornamento) – sectus

+0

Grazie, setto! "Le seconde cartelle hanno dimensione 0". - Anche le cartelle, quindi non è abbastanza preciso. Ma il tuo primo modo funzionerà. getFromIndex() restituisce il nome completo della voce con/(indipendentemente dal sistema operativo) alla fine solo per le voci della cartella. – StanE

0

Basta controllare la dimensione del file, se è zero è una cartella.

$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

Dovrebbe essere '! = 0' (senza virgolette) poiché la dimensione è data come numero intero. – ComFreek

+0

@ComFreek funziona per me con le virgolette – David

+0

Funziona, ovviamente, ma è uno stile di programmazione scadente. Prova a cambiare '==' a '===' e non funzionerà più perché tre segni uguali controllano anche l'uguaglianza di tipo. – ComFreek

Problemi correlati