2010-08-05 5 views
0

Le problème:Comment obtenir des valeurs clés avec foreach?


Salut! Je fais un formulaire de téléchargement de fichier où je peux télécharger des photos, j'ai ajouté multiple="" au input et pour le name="upload_photo[]" afin que je puisse télécharger plusieurs fichiers. Quand j'imprime $_FILES['upload_photo'] je reçois ceci et je veux obtenir le values de chaque avec foreach. Par exemple, je veux juste [name] ce qui sera egg.jpg et green.jpg.

Array 
(
    [name] => Array 
     (
      [0] => egg.jpg 
      [1] => green.jpg 
     ) 

    [type] => Array 
     (
      [0] => image/jpeg 
      [1] => image/jpeg 
     ) 

    [tmp_name] => Array 
     (
      [0] => C:\wamp\tmp\php50E9.tmp 
      [1] => C:\wamp\tmp\php50EA.tmp 
     ) 

    [error] => Array 
     (
      [0] => 0 
      [1] => 0 
     ) 

    [size] => Array 
     (
      [0] => 24450 
      [1] => 65030 
     ) 

) 

C'est ce que je l'ai essayé jusqu'à présent


Mais cela me donne tout ce que je n'ai pas le contrôle.

foreach($_FILES['upload_photo'] as $keys => $file){ 

    foreach($_FILES['upload_photo'][$keys] as $key => $files){ 
    echo $files . "<br />"; 
    } 
} 
+0

Attendez, quoi? Je suis confus.; pourquoi avez-vous ajouté 'multiple =" "' au '' si vous ne semblez pas vouloir plusieurs? –

+0

: D Man, je viens de montrer une version où j'ai téléchargé un seul fichier, ok je vais l'éditer: P – Adam

+0

OMG !! :))) ... Vérifiez à nouveau, ahhh – Adam

Répondre

1

Je pense c'est ce que vous essayez de faire, donner un coup de feu ce:

foreach($_FILES['upload_photo'] as $photo) { 
    echo $photo['name']; 
} 

Je ne sais pas comment votre tableau $_FILES obtenu structuré comme celui-ci, et il semble vous avez changé votre question depuis que j'ai répondu, car ma solution fonctionnait de la façon dont votre question a été postée à l'origine.

Ainsi, pour la nouvelle structure de tableau de $_FILES vous devrez utiliser des boucles imbriquées, comme ceci:

foreach($_FILES['upload_photo'] as $photo) { 
    foreach($photo['name'] as $name) { 
     echo $name; 
    } 
} 
+0

Le résultat: 'Avis: Undefined index: nom dans C: \ wamp \ www \ includes \ upload_photo.php sur la ligne 7' x5, x5 car il y a 5 clés. – Adam

+0

@CIRK voir la mise à jour solution – jordanstephens

+0

Je n'ai pas changé ma question, je l'ai juste améliorée pour être plus compréhensible :), je pense que cela va fonctionner, j'ai fait quelque chose de similaire en ce moment, laissez-moi l'essayer. – Adam

0

Ressemble $ _FILES est bizarre. Donc, pour obtenir les noms, ce que vous voulez est tout simplement ...

foreach($_FILES['upload_photo']['name'] AS $name) { 
    echo $name . "<br />"; 
} 

Ou, basé sur mon commentaire ci-dessous, vous pouvez faire ...

foreach($_FILES['upload_photo'] AS $key => $file) { 
    if ($key == 'name') { 
     foreach($file AS $name) { 
      echo $name . "<br />"; 
     } 
    } 
} 
+0

mais alors j'ai besoin de faire une foreach pour toutes les touches! Êtes-vous sûr que c'est la meilleure façon? : S – Adam

+0

Basé sur la façon dont le tableau $ _FILES est conçu, il apparaît - vous devez parcourir chaque clé pour obtenir les informations pour chaque fichier, sauf (ce qui aurait plus de sens) s'il a été conçu comme '$ _FILES [' upload_photo '] [0] [' nom '] '. La seule autre façon, en réalité, serait d'avoir une seule boucle comme 'foreach ($ _FICHES ['upload_photo'] AS $ key => $ fichier), puis de vérifier si $ key =" name "' dans chaque itération . Ce qui, en fait, si vous l'avez combiné avec une instruction 'switch', n'est peut-être pas une mauvaise façon de procéder. – Andrew

+0

En outre, dans votre question, vous avez spécifié ne vouloir que le 'nom', alors ne vous tournez pas et dites" mais ça ne m'apporte que le nom! " ;) – Andrew

1

Est-ce que vous êtes après? Je ne suis pas sûr que ce soit comme cela que je voudrais gérer cette situation, mais je pense que cela fonctionnerait dans votre cas.

edit: oublié le comte

Edit2: Si vous savez que votre tableau contient les touches indiquées dans l'exemple ci-dessus, pour recevoir toutes les valeurs de tout le tableau ['name'], vous feriez le suivi:

for ($i = 0; $i < count($_FILES['upload_photo']['name']); $i++) 
{ 
    $name = $_FILES['upload_photo']['name'][$i]; 
    //do something else 
} 

OU

foreach ($_FILES['upload_photo']['name'] as $value) 
{ 
    $name = $value; 
    //do something else 
} 

Comme d'autres l'ont montré -

Vous semblez connaître les touches de tableau impliquées/elles sont statiques, il ne vous reste plus qu'à déterminer combien de fichiers il y a - compter les éléments dans le tableau et les parcourir plusieurs fois.

1

peut-être c'est l'idée de vous aider lors de l'exécution du code ci-dessous avec vos données fournies dans $ _FILES il imprimera quelque chose comme

télécharger 1

name = ...

size = ...


télécharger 2

name = ...

size = ...

$numUploads = count($_FILES['upload_photo']['name']); 
for ($n = 0; $n < $numUploads; $n++) { 

    echo 'upload ' . $n . '<br/>'; 
    foreach ($_FILES['upload_photo'] as $prop => $values) { 

     echo $prop . ' = ' . $_FILES['upload_photo'][$prop][$n] . '<br/>'; 
    } 

    echo '<hr/>'; 
} 
+0

Merci pour votre réponse, laissez-moi l'essayer – Adam

+0

Hmm, et comment devrais-je juste obtenir le 'nom' ou' tmp_name'? J'ai besoin de spécifier une variable pour eux – Adam

+0

retirer la boucle intérieure et faire quelque chose comme $ currentFileName = $ _FILES ['upload_photo'] ['nom'] [$ n]; $ currentTempName = $ _FILES ['upload_photo'] ['tmp_name'] [$ n]; –

1

Si vous voulez tout est JUSTE les noms des fichiers téléchargés, cela fonctionnera:

foreach($_FILES['upload_photo']['name'] as $idx => $name) { 
    echo "File #$idx: $name<br />" 
} 

Si vous voulez traiter chaque fichier téléchargé, alors vous aurez besoin de quelque chose comme ceci:

foreach(array_keys($_FILES['upload_photo']['name']) as $idx) { 
    move_uploaded_file($_FILES['upload_photo']['tmp_name'][$idx], '/some/where/on/your/server'); 
} 
Questions connexes