问题描述
|
好的,所以我有一个包含以下元素的数组:
$array[\'a\'][\'b\'][0][\'c\'];
$array[\'a\'][\'b\'][1][\'c\'];
$array[\'a\'][\'d\'][0][\'c\'][\'c\'];
$array[\'b\'][\'c\'];
然后在一个单独的数组中,我定义了这些值的路径:
$structure[0] = array(\'a\',\'b\',\'#\',\'c\');
$structure[1] = array(\'a\',\'d\',\'c\',\'c\');
$structure[2] = array(\'b\',\'c\');
最后,我有一个保存值的数组:
$values[0] = array(\'value0-0\',\'value0-1\');
$values[1] = array(\'value1-0\');
$values[2] = array(\'value2-0\');
我正在尝试找到一个简单的函数/循环,该函数/循环将能够将$ values中的值应用于$ structure中定义的$ array的数组路径。
最终结果将是:
$array[\'a\'][\'b\'][0][\'c\']=\'value0-0\';
$array[\'a\'][\'b\'][1][\'c\']=\'value0-1\';
$array[\'a\'][\'d\'][0][\'c\'][\'c\']=\'value1-0\';
$array[\'b\'][\'c\']=\'value2-0\';
在$ values [0]或$ values [1]的情况下,它将能够遍历每个值,并用与该特定$ value相同的迭代号替换\'#\'的$ structure元素。
这仅仅是折腾并编写绘制的递归函数的一种情况,还是有一个可以提供更优雅解决方案的智能构造或PHP函数?
解:
多亏了Mario,我最终的解决方案是:
foreach ($struct as $i=>$keys)
foreach ($values[$i] as $val) {
$r = & $array;
foreach ($keys as $key) {
if ($key == \"#\") { $key = $i; }
$r = & $r[$key]; // move pointer to subarray
}
$r = $val;
}
}
解决方法
您将必须使用引用来遍历目标数组:
function inject($array,$struct,$values) {
foreach ($struct as $i=>$keys)
foreach ($values[$i] as $val) {
$r = & $array;
foreach ($keys as $key) {
if ($key == \"#\") { $key = count($r); }
settype($r[$key],\"array\");
$r = & $r[$key]; // move pointer to subarray
}
$r = $val;
}