【发布时间】:2016-09-23 20:27:29
【问题描述】:
我尝试编写改变多维 $_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>";
?>
【问题讨论】:
-
那么,你的尝试在哪里?
-
我来id的第一件事就是使用多个循环。我想知道这是否可能。
-
我添加了我的一项尝试。