2016-09-23 163 views
-3

我尝试编写改变多维$ _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>"; 


?> 
+2

那么,哪里是你试试? –

+0

我来id使用多个循环的第一件事。我想知道这是否可能。 –

+0

我添加了一个我的尝试。 – Petr

回答

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]); 
} 

DEMO

+0

我不认为它有效...... – Petr

+0

我在循环中删除了旧条目中的一些错误,现在我修正了它们。我已经添加了一个演示,显示它的工作原理。 – Barmar

+0

它与$ _FILES ['图片']一起使用,但使用$ _FILES ['contract'](在任务描述中看到)不起作用... – Petr