RobertP Posted April 18, 2012 Share Posted April 18, 2012 Everyone that has tried to upload multiple files via the 'multiple' attribute in their input, have noticed that you get a 'stupid' array on the server side. Results when uploading a single file. $_FILES['my_file'] = array( 'tmp_name'=>'\tmp\204294.png', 'name'=>'my-files-original-name.png', 'size'=>2048, 'type'=>'image/png', 'error'=>0 ); Results when uploading multiple files. $_FILES['my_files'] = array( 'tmp_name'=>array( 0=>'\tmp\204294.png', 1=>'\tmp\573912.png', 2=>'\tmp\019283.png', ), 'name'=>array 0=>'my-files-original-name-1.png', 1=>'my-files-original-name-2.png', 2=>'my-files-original-name-3.png', ), 'size'=>array( 0=>2048, 1=>2022, 2=>2334, ), 'type'=>array( 0=>'image/png', 1=>'image/png', 2=>'image/png', ), 'error'=>array( 0=>0, 1=>0, 2=>0, ) ); What i would expect from multiple files. $_FILES['my_file'] = array( 0=>array( 'tmp_name'=>'\tmp\204294.png', 'name'=>'my-files-original-name-1.png', 'size'=>2048, 'type'=>'image/png', 'error'=>0 ), 1=>array( 'tmp_name'=>'\tmp\533322.png', 'name'=>'my-files-original-name-2.png', 'size'=>2533, 'type'=>'image/png', 'error'=>0 ), 2=>array( 'tmp_name'=>'\tmp\34662.png', 'name'=>'my-files-original-name-3.png', 'size'=>2332, 'type'=>'image/png', 'error'=>0 ) ); Now the whole reason for this post is to help re-order the 'stupid' array that we get into what i think is a much better format. This is my current function, but i would like something abit more cleaner, and have support for more fields. public static function separateMultipleFiles($rawFiles){ $files = array(); for($i=0;$i<count($rawFiles['tmp_name']);$i++){ $files[] = array( 'tmp_name'=>$rawFiles['tmp_name'][$i], 'name'=>$rawFiles['name'][$i], 'size'=>$rawFiles['size'][$i], 'type'=>$rawFiles['type'][$i], 'error'=>$rawFiles['error'][$i], ); } return $files; } Quote Link to comment https://forums.phpfreaks.com/topic/261143-multiple-file-upload/ Share on other sites More sharing options...
TimeBomb Posted April 18, 2012 Share Posted April 18, 2012 I came up with the following: function organizeFileArray($array) { $organizedArr = array(); $tmpFunc = function($value, $key, $element) use (&$organizedArr) { if (! isset($organizedArr[$key])) { $organizedArr[$key] = array(); } $organizedArr[$key][$element] = $value; }; foreach (array_keys($array) as $key) { $element = $array[$key]; array_walk($element, $tmpFunc, $key); } return $organizedArr; } It'll produce the same result as your function, but is a lot more dynamic. The downfall is that, after a bit of benchmarking, your function is around 400% faster than mine. So there is indeed room for optimization. I hope it helps, gl. Edit: I just noticed that the function array_walk is completely unnecessary in this scenario. I modified the function to reflect this: function organizeFileArray($array) { $organizedArr = array(); foreach (array_keys($array) as $key) { $element = $array[$key]; $currElement = $key; foreach($element as $key => $value) { if (! isset($organizedArr[$key])) { $organizedArr[$key] = array(); } $organizedArr[$key][$currElement] = $value; } } return $organizedArr; } Your function is only 80% faster than this - much less appalling than 400% faster. Quote Link to comment https://forums.phpfreaks.com/topic/261143-multiple-file-upload/#findComment-1338322 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.