bonjour,
pourquoi est il impossible de lire le tableau $_FILE par position ?
celà ne fonctionne que quand je met le nom de la cléCode:echo $_FILE[0];
Code:echo $_FILE['name'];
Version imprimable
bonjour,
pourquoi est il impossible de lire le tableau $_FILE par position ?
celà ne fonctionne que quand je met le nom de la cléCode:echo $_FILE[0];
Code:echo $_FILE['name'];
Parce que justement c'est un tableau indexé par clé et non par numéro d'indices. Ca s'appelle un tableau associatif.
je pensais qu'un tableau était quoi qu'il arrive toujours accessible par un l'indice de position. Tu ne sais pas comment je pourrais faire pour avoir accès au tableau de cette façon? $_FILE[0], $_FILE[1], ...
Merci
J'aurai pensé la meme chose, mais un test rapide prouve le contraire :
donne ca :Code:
1
2
3
4
5
6 <?php $a =array('aaa'=> 4, 'bbb' => 5); echo "Valeur par clé : " . $a['aaa'] . "<br/>"; echo "Valeur par indice : ". $a[1] ."<br/>"; ?>
Et pour l'accès direct, une astuce de ce style devrait fonctionner :Code:
1
2Valeur par clé : 4 Valeur par indice :
Mais je ne vois pas trop l'intéret, tu n'as aucune idée dans un tableau associatif de ce qui sera considéré comme la première clé, la seconde clé etc.Code:
1
2
3
4
5
6
7
8 $fileIndexTab = array(); foreach($_FILES as $valeur) { $fileIndexTab[] = $valeur; } echo $fileIndexTab[0];
pourtant fait un peu un print_r(array_keys($_FILES));
Et ben il suffit de faire ca alors:
ce qui revient surement au meme que de construire ton tableau, parce que array_keys() utilise surement un foreach() pour récupérer les clés.Code:
1
2
3
4
5
6
7
8
9
10
11
12 <?php $monTabAssoc = array ( 'cle1' => "valeur 1", 'cle2' => "valeur 2", 'cle3' => "valeur 3", 'cle4' => "valeur 4" ); $cleTab = array_keys($monTabAssoc); echo $monTabAssoc[$cleTab[0]]; ?>
La notion de tableaux (indexés numériquement) et de hashage ne font qu'un en PHP. En général, quand on utilise un hashage (tableau indexé par des clés en PHP), vous ne retrouverez pas nécessairement les clés dans le même ordre que celui dans lequel elles ont été définies : cela vient de la structure/organisation interne du hashage.
$_FILES est créé de sorte que, dans un upload multiple de fichiers, il ait cette forme :
Et non celle-ci :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Array( 'name' => Array( 0 => nom du fichier 1, 1 => nom du fichier 2 ), 'tmp_name' => Array( 0 => chemin du fichier temporaire 1, 1 => chemin du fichier temporaire 2 ), 'error' => Array( ... ), 'size' => Array( ... ), 'type' => Array( ... ) )
Code:
1
2
3
4
5
6
7
8
9
10
11
12 Array( 0 => Array( 'name' => nom du fichier 1, 'tmp_name' => chemin du fichier temporaire 1, 'error' => ..., 'size' => ..., 'type' => ... ), 1 => Array( ... ) )
C'est vrai que je trouve moi aussi la deuxième plus pratique et plus logique. Pour contourner son fonctionnement, vous ne pouvez faire que des associations comme celle que propose koopajah (à moins de patcher PHP ...).
bon je vais poster mon problème complet parceque je n'arrive pas à trouver comment faire.
j'ai 2 champ d'uploads(doc, ref). chacun d'entre eux peut contenir plusieur fichiers à uploader. Tout ceci ce fait en javascript/php à l'aide d'un script.soit..
Au final j'obtient un tableau comme ceci
la 2 ème clé est vide, c'est normal, c'est un bug, mais passons ceci.
Il faudrait que je puisse séparé les clés "doc" des clés "ref".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Array ( [doc_1] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) [doc_0] => Array ( [name] => AcajoomNews1.2.3.zip [type] => application/octetstream [tmp_name] => c:/wamp/tmp\php1F3.tmp [error] => 0 [size] => 677512 ) [ref_1] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) [ref_0] => Array ( [name] => Remository341.zip [type] => application/octetstream [tmp_name] => c:/wamp/tmp\php1F5.tmp [error] => 0 [size] => 719983 ) )
et par exemple uploader les fichiers de chacune de ces clé dans des 2 dossiers respectif.
Merci pour votre aide
Code:
1
2
3
4
5
6
7 <form method="POST" action="upload.php" enctype="multipart/form-data"> Doc 0 : <input type="file" name="doc[]" /><br /> Doc 1 : <input type="file" name="doc[]" /><br /> Ref 0 : <input type="file" name="ref[]" /><br/> Ref 1 : <input type="file" name="ref[]" /><br /> <input type="submit" value="Envoyer" /> </form>
:fleche:Code:
1
2
3
4 <?php header('Content-type: text/plain'); print_r($_FILES); ?>
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 Array ( [doc] => Array ( [name] => Array ( [0] => 0226.jpg [1] => 0260.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => C:\PROGRA~1\EASYPH~1\\tmp\php4.tmp [1] => C:\PROGRA~1\EASYPH~1\\tmp\php5.tmp ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 64036 [1] => 329467 ) ) [ref] => Array ( [name] => Array ( [0] => 0280.jpg [1] => 0297.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => C:\PROGRA~1\EASYPH~1\\tmp\php6.tmp [1] => C:\PROGRA~1\EASYPH~1\\tmp\php7.tmp ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 190177 [1] => 623803 ) ) )
:question:
pour ne pas faire 50 champs upload j'utilise un script php/javascript
http://the-stickman.com/web-developm...-file-element/
donc j'obtient un tableau sous la forme que j'ai montré donc je suis obligé de partir de la.
il faudrait que dans chaque foreach un test soit effectué sur le préfix de la clé [doc_] ou [ref_] et uploader dans le bon répertoire
Et si tu gardes ton script actuel et que tu fais qqch comme ca :
En fait tu peux accéder a tes clés puisque tu sais exactement comment elles se nomment (ce que tu sais pas en fait c'est le nombre de clés que tu auras)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <?php $finTable = false; $index = 0; while(!$fintableau) { // si le document d'index $i existe if(isset($monTab["doc_".$i])) { // traitement spécial } else // plus de clé { $fintableau = true; } $i++; } ?>
t'en penses quoi?
j'ai finalement essayé ça et ça fonctionne
Merci beaucoup pour votre aideCode:
1
2
3
4
5
6
7
8
9
10
11 $ul = new AP_File_Upload(); $CptNumericKeys = 0; foreach($_FILES as $file){ $ArrayNumericKeys = array_keys($_FILES); $pattern_a = 'doc'; $pattern_b = 'ref'; if(stripos($ArrayNumericKeys[$CptNumericKeys], $pattern_a) !== false){if(!empty($file['name']) && $ul->save_file($file,$destination) == false){$ERROR = true;}} if(stripos($ArrayNumericKeys[$CptNumericKeys], $pattern_b) !== false){if(!empty($file['name']) && $ul->save_file($file,$destination.'ref/') == false){$ERROR = true;}} $CptNumericKeys ++; }