2016-09-23 161 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