我尝试编写改变多维$ _FILES结构的通用方法。
例如,我们有:
$_FILES['picture']['name'][8][4][2] = img.jpg
$_FILES['picture']['tmp_name'][8][4][2] = abcd
$_FILES['picture']['size'][8][4][2] = 50
我们需要什么:
$_FILES['picture'][8][4][2]['name'] = img.jpg
$_FILES['picture'][8][4][2]['tmp_name'] = abcd
$_FILES['picture'][8][4][2]['size'] = 50
解决方案应该适用于所有可能的$ _FILES。 请问任何想法?
编辑:这是我的尝试之一。
适用于$ _FILES ['picture'],它不适用于$ _FILES ['contract']。
<?php
ini_set('display_errors','on');
error_reporting(E_ALL);
function recursive_keys($input, $search_value = null){
$output = ($search_value !== null ? array_keys($input, $search_value) : array_keys($input)) ;
foreach($input as $sub){
if(is_array($sub)){
$output = ($search_value !== null ? array_merge($output, recursive_keys($sub, $search_value)) : array_merge($output, recursive_keys($sub))) ;
}
}
return $output ;
}
function mergeArrays($arr1, $arr2){
foreach($arr2 as $key => $value){
if(array_key_exists($key, $arr1) && is_array($value)) {
$arr1[$key] = mergeArrays($arr1[$key], $arr2[$key]);
}else{
$arr1[$key] = $value;
}
}
return $arr1;
}
function varFromKeys($ar,$val){
$res = array();
$ref = &$res;
foreach ($ar as $key) {
$ref[$key] = array();
$ref = &$ref[$key];
}
$ref = $val;
return $res;
}
$_FILES['picture']['name'][8][4][2] = 'img.jpg';
$_FILES['picture']['tmp_name'][8][4][2] = 'abcd';
$_FILES['picture']['size'][8][4][2] = '50';
$_FILES['contract']['name'][5][10][6][3] = 'contract.txt';
$_FILES['contract']['tmp_name'][5][10][6][3] = 'efgh';
$_FILES['contract']['size'][5][10][6][3] = '200';
$_FILES['contract']['name'][5][10][6][4] = 'contract2.txt';
$_FILES['contract']['tmp_name'][5][10][6][4] = 'ijkl';
$_FILES['contract']['size'][5][10][6][4] = '300';
$myFiles=array();
foreach($_FILES as $nameKey => $name){
foreach($name as $propKey => $prop){
$keys=array_merge(array($nameKey),recursive_keys($_FILES[$nameKey][$propKey]),array($propKey));
/*
echo "<pre>";
print_r($keys);
echo "</pre>";
*/
$var=varFromKeys($keys,'xxx');
$myFiles=mergeArrays($myFiles,$var);
}
}
echo "<pre>";
print_r($myFiles);
echo "</pre>";
?>
答案 0 :(得分:0)
使用嵌套循环
$keys = array_keys($_FILES['picture']);
foreach ($_FILES['picture']['name'] as $i => $subarray1) {
foreach ($subarray1 as $j => $subarray2) {
foreach ($subarray2 as $k => $file) {
foreach ($keys as $key) {
$_FILES['picture'][$i][$j][$k][$key] = $_FILES['picture'][$key][$i][$j][$k];
}
}
}
}
// Remove the old entries
foreach ($keys as $key) {
unset ($_FILES['picture'][$key]);
}