2010-01-30 56 views
5

Puede haber una mejor manera de hacer esto y ciertamente estoy abierto a sugerencias.¿Cómo obtener el número total de iteraciones en un foreach

Tengo un script de carga de archivos que se encargará de múltiples archivos. Lo que quiero hacer es contar el número de iteraciones que el lazo hace para cada archivo que se ha movido con éxito y si ese número es igual al número total de archivos subidos, a continuación, utilizar una excepción para mostrar al usuario de que se recibieron los archivos.

pensé que iba a incrementar el interior del bucle luego contar a partir de ahí, pero lo que quiero decir es una matriz para cada archivo que se sube lo que se traduce en un total incorrecto. ¿Hay una mejor manera de hacer esto o contar con éxito cada iteración?

Esta es la estructura que tengo que trabajar con

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

Espera ... ¿dijiste que utilizarías una excepción para demostrar que la operación se realizó correctamente? –

+0

Sí. ¿¿¿No es bueno??? – Timmay

+3

usando excepciones para el flujo de control es muy, muy malo! –

Respuesta

3

Más o menos, tiene que hacerlo con un contador.

$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 
} 

Editar - Se puede establecer un indicador de error, o banderas en su manejo de errores ... pero no hay realmente una manera de hacer esto que es sorprendentemente mejor.

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

Gracias Dave. Ya he intentado usar un contador, pero primero estoy buscando $ _FILES ['error']. Si hay un error, arrojo una excepción. Voy a publicar un código arriba en un minuto. Por favor échale un vistazo. – Timmay

+0

No creo que haya una forma mucho mejor de hacerlo. Por supuesto, si hay, quiero verlo. – davethegr8

+0

Gracias Dave.Usando su ejemplo, ¿esto me impediría usar excepciones en el bloque else? – Timmay

0

foreach ($array as &$item)

Sólo puede hacer count($array)

+0

Gracias Paul, pero como he dicho anteriormente, que no produce los resultados correctos. Obtengo una matriz por cada archivo que se cargó. Si fuera una única matriz, funcionaría. Parece que no puedo obtener la matriz correcta. – Timmay

+0

Eso es lo que llamamos una matriz multidimensional o anidada. Por lo tanto, para cada archivo que se carga, se obtiene otra matriz dentro de la matriz $ _FILES. Cada matriz en $ _FILES contiene información sobre un archivo específico. Y usted * puede * contar ($ _ ARCHIVOS), no hay problema allí. –

+0

Sí, estoy muy familiarizado con las matrices multidimensionales. Con la estructura predeterminada de la matriz $ _FILES, al cargar varios archivos, esto no es posible sin antes reorganizar esa matriz. – Timmay

0

sólo tirar esto hacia fuera allí ya se conoce el número de archivos de la forma, sino simplemente utilizando un bucle for. con dos contadores uno para el ciclo y uno para los éxitos, y a menos que su secuencia de comandos falle en su mayoría (y no quiera que tan inusual sea que todo funcionó) no arroje una excepción si todo funciona.

+0

hmm .. Eso tiene sentido. ¿Cómo usaría dos contadores? – Timmay

0

Aquí se puede ver que se puede uso count ($ _ FILES) para contar el número de archivos subidos. Eso sí, este no es el número de correctamente archivos cargados.

<?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, gracias por el ejemplo. Lo que obtengo cuando cargo dos archivos es un conteo de "2" 2x. En otras palabras, un "2" para cada iteración. ¿No hay una manera de que solo cuente una sola vez? – Timmay

+0

Lo siento, simplemente no te entiendo, ¿puedes dar un ejemplo de código? O, dejémoslo, veo que ya has marcado una respuesta como correcta. –

Cuestiones relacionadas