PHP设置动态数组索引

3

我从我的$_POST变量中得到了以下的键/值

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

我希望将这些值设置为以下数组:
$data[translations][0][comment] = 'Greetings from UK';

这个想法是我可以在我的KEY值中放置任何内容,然后从中填充一个数组。

有没有不使用eval()的安全方法来实现这一点?

非常感谢所有的帮助。

更新:

下面是使用eval()的想法。

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

1
只是好奇:eval() 怎么会有帮助呢? - Álvaro González
2
@Álvaro G. Vicario,我刚刚更新了我的回答。 - Adnan
5个回答

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

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()


嗯...但是我可以在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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接