2012-06-06 68 views
3

我有以下key/value从我$_POST变量:PHP设置动态数组索引

Array 
(
    'translations_0_comment' => 'Greetings from UK' 
) 

我想什么是这个值设置为以下阵列

$data[translations][0][comment] = 'Greetings from UK'; 

这样的想法是,我可以在我的KEY值中包含任何内容,并从中填充数组。

有没有安全的方法可以做到这一点,而不使用eval()

所有帮助表示赞赏。

UPDATE:

,这将是与eval()

foreach ($_POST as $key => $dataValue) {    
    $a = explode("_", $key); 
    $builder = '$object'; 
    foreach ($a as $value) { 
     $builder.='['.$value.']'; 
    } 
    $builder.=' = '.$dataValue.';'; 
    eval($builder);   
} 
+1

只是好奇:eval()怎么会有帮助呢? –

+2

@ÁlvaroG. Vicario,刚刚更新了我的回答 – Adnan

回答

5

我认为你正在寻找这个

function set_value($object, $paths, $value, $index){ 

    $key = $paths[$index]; 

    $sub_object = $object[$key]; 
    if (!is_array($sub_object)){ 
     $object[$key] = $value; 
    }else{ 
     $index = $index+1; 
     $object[$key] = set_value($sub_object, $paths, $value, $index); 
    } 
    return $object; 
} 
+0

正好米奇... – Adnan

+0

@Adnan其中Mich?Connor ? – ant

1

我觉得this的想法是你正在寻找

什么实例

在您的形式产生$ _POST数据重命名输入属性如下

<input name="data[translations][0][comment]" /> 

,现在你$_POST['data']将是一个数组

1

explode()是你所需要的:

$data = array(); 
foreach ($postData as $key => $val) { 
    $explodedKey = explode('_', $key); 
    $data[$explodedKey[0]][$explodedKey[1]][explodedKey[2]] = $val; 
} 

无需使用eval()

+0

嗯......但我可以有任何数量的_在KEY中,所以它不限于3. – Adnan

0
$data = array(); 
foreach ($_POST as $keys => $val) { 
    $keys_list = explode('_', $keys); 
    $link = &$data; 
    foreach ($keys_list as $key) { 
     $link[$key] = $val; 
     $link = &$link[$key]; 
    } 
} 
0

试试这个先生。

$array = array 
(
    'TRY_THIS_ONE_SIR_PLEASE_THANKS' => 'Greetings from UK' 
); 

$array1 = array_keys($array); 
$arrValue = array_values($array); 
$array1 = explode("_", $array1[0]); 

$ctr = count($array1); 
for($i=0; $i<$ctr; $i++) 
{ 
    $start .= "array(\"".$array1[$i]."\" => "; 
    $end .=")"; 
} 
$start = $start ."\"".$arrValue[0]."\"".$end; 

eval("\$arr = $start;"); 

print_r($arr);