2010-01-30 11 views
5

Es gibt möglicherweise eine bessere Möglichkeit, dies zu tun, und ich bin offen für Vorschläge.So erhalten Sie die Gesamtzahl der Iterationen in einem Foreach

Ich habe ein Skript zum Hochladen von Dateien, das mehrere Uploads verarbeiten kann. Ich möchte die Anzahl der Iterationen zählen, die die Schleife für jede erfolgreich verschobene Datei durchführt, und wenn diese Anzahl der Gesamtzahl der hochgeladenen Dateien entspricht, eine Ausnahme verwenden, um dem Benutzer anzuzeigen, dass die Dateien empfangen wurden.

Ich dachte, dass ich innerhalb der Schleife erhöhen würde, dann von dort zählen, aber was ich bekomme, ist ein Array für jede Datei, die hochgeladen wird, was zu einer falschen Summe führt. Gibt es einen besseren Weg dies zu tun oder jede Iteration erfolgreich zu zählen?

Dies ist die Struktur I mit

foreach($files as $file) 
    { 
     if ($file['error'] == UPLOAD_ERR_OK) 
     { 
      move_uploaded_file($file['tmp_name'], $filename); 
     } 
     else 
     { 
      //error 
     } 
    } 
+7

Warten ... haben Sie gesagt, dass Sie eine Ausnahme verwenden werden, um anzuzeigen, dass der Vorgang erfolgreich war? –

+0

Ja. Nicht gut??? – Timmay

+3

die Verwendung von Ausnahmen für den Kontrollfluss ist sehr, sehr schlecht! –

Antwort

3

Sie müssen es ziemlich viel mit einem Zähler tun.

$success = 0; 
foreach($_FILES as $file) { 

    if(is_uploaded_file($file['tmp_name'])) { 
     move_uploaded_file($file['tmp_name'], $destination); 
     $success += 1; 
    } 
} 

if($success != count($_FILES)) { 
    //error message/exception 
} 

bearbeiten - Sie können einen Fehler-Flag oder Flags in Ihrer Fehlerbehandlung gesetzt ... aber es ist nicht wirklich eine Möglichkeit, dies zu tun, dass irrsinnig besser ist. siehe

foreach($files as $file) 
{ 
    if ($file['error'] == UPLOAD_ERR_OK) 
    { 
     move_uploaded_file($file['tmp_name'], $filename); 
    } 
    else 
    { 
     //error 
     $upload_errors += 1; 
     //or, to get a little more info... 
     //$upload_errors[] = $file 
    } 
} 

if($upload_errors == 0) { //or count($upload_errors) == 0 
    // tell the user that the upload failed. 
} 
+0

Danke Dave. Ich habe bereits versucht, einen Zähler zu verwenden, aber ich suche zuerst nach $ _FILES ['error']. Wenn es einen Fehler gibt, werfe ich eine Ausnahme aus. Ich werde in einer Minute obenstehenden Code posten. Bitte guck dir das an. – Timmay

+0

Ich glaube nicht, dass es einen wesentlich besseren Weg dafür gibt. Natürlich, wenn ich es sehen möchte. – davethegr8

+0

Danke Dave.Würde ich damit Ihr Beispiel davon abhalten, Ausnahmen im else-Block zu verwenden? – Timmay

0

foreach ($array as &$item)

Sie können dies nur tun count($array)

+0

Danke Paul aber wie ich oben sagte, dass das nicht die richtigen Ergebnisse produziert. Ich erhalte für jede hochgeladene Datei ein Array. Wenn es ein einzelnes Array wäre, würde es funktionieren. Ich kann einfach nicht scheinen, das Array richtig zu bekommen. – Timmay

+0

Das nennen wir ein mehrdimensionales oder verschachteltes Array. Für jede Datei, die hochgeladen wird, erhalten Sie ein anderes Array innerhalb des Arrays $ _FILES. Jedes einzelne Array in $ _FILES enthält Informationen zu einer bestimmten Datei. Und du * kannst * zählen ($ _ FILES), kein Problem da. –

+0

Ja, ich bin mit mehrdimensionalen Arrays sehr vertraut. Mit der Standardstruktur des $ _FILES-Arrays ist es beim Hochladen mehrerer Dateien nicht möglich, das Array erst neu anzuordnen. – Timmay

0

gerade werfen, dort zu arbeiten haben heraus, da Sie die Anzahl der Dateien wissen, wie, aber nur mit eine for-Schleife. mit zwei Zählern eins für die Schleife und eins für Erfolge, und wenn Ihr Skript meistens nicht funktioniert (und Sie nicht wollen, wie ungewöhnlich es ist, dass alles funktioniert hat), werfen Sie keine Ausnahme, wenn alles funktioniert.

+0

hmm .. Das macht Sinn. Wie würde ich zwei Zähler verwenden? – Timmay

0

Hier können Sie, dass Sie können Verwendung count ($ _ FILES) die Anzahl der hochgeladenen Dateien zu zählen. Wohlgemerkt, das ist nicht die Anzahl der korrekt hochgeladenen Dateien.

<?php 
if (isset($_FILES) && !empty($_FILES)) { 
    echo count($_FILES).' files were uploaded<br>'; 
    ?><pre><?php 
    print_r($_FILES); 
    ?></pre><?php 

} 
?> 
<form 
    action="<?php echo $_SERVER['PHP_SELF'];?>" 
    method="post" 
    enctype="multipart/form-data" 
> 
    File 1<input type="file" name="file1"><br> 
    File 2<input type="file" name="file2"><br> 
    File 3<input type="file" name="file3"><br> 
    <input type="submit" value="upload"> 
</form> 
+0

Niels, danke für das Beispiel. Was ich bekomme, wenn ich zwei Dateien hochlade, ist eine Anzahl von "2" 2x. Mit anderen Worten, eine "2" für jede Iteration. Gibt es nicht einen Weg, es nur einmal zählen zu lassen? – Timmay

+0

Entschuldigung, ich verstehe Sie einfach nicht, können Sie ein Codebeispiel geben? Oder lass es sein, ich sehe, du hast bereits eine Antwort als richtig markiert. –

Verwandte Themen