我创建了一个函数,它返回一个基于另外两个数组的值和键的嵌套数组,并为最深的键指定第三个值(希望它对代码有意义):
function myfunc_build_array($mydata,$keys,$value)
{
$newarr=array();
foreach ($mydata as $data)
{
$evalvar='$newarr';
foreach ($keys as $key)
{
$evalvar.="['".$data[$key]."']";
}
$evalvar.='=$value;';
eval($evalvar);
}
return $newarr;
}
所以,即如果我们有:
$mydata=array(
0=>array('section'=>'NS1','subsection'=>'NS1A','employee'=>'2812','name'=>'Bob'),
1=>array('section'=>'NS1','subsection'=>'NS1A','employee'=>'2811','name'=>'Bib'),
2=>array('section'=>'NS1','subsection'=>'NS1B','employee'=>'2718','name'=>'Bub'),
);
$keys= array('section','subsection','employee');
myfunc_build_array的结果($ mydata,$ keys,“active”);是:
array(1) {
["NS1"]=>
array(2) {
["NS1A"]=>
array(2) {
[2812]=>
string(6) "active"
[2811]=>
string(6) "active"
}
["NS1B"]=>
array(1) {
[2718]=>
string(6) "active"
}
}
}
它工作正常,但由于我通常避免使用eval(),我想知道是否有更好的方法来做,更优雅或更快。
答案 0 :(得分:2)
使用引用可以在没有eval()
的情况下执行此操作。不知道它是否更快,但它可能更安全:
function myfunc_build_array($keySets,$keyIndices,$value)
{
$slot = null;
$newarr=array();
foreach ($keySets as $keys)
{
$slot = &$newarr;
foreach ($keyIndices as $keyIndex)
{
$slot = &$slot[$keys[$keyIndex]];
}
$slot = $value;
}
return $newarr;
}
答案 1 :(得分:1)
这对我有用,虽然我不一定称之为优雅:
function myfunc_build_array($mydata,$keys,$value)
{
$newarr = array();
end( $keys);
$last_key = key( $keys);
foreach ($mydata as $data)
{
$temp =& $newarr;
foreach ($keys as $i => $key)
{
$temp[$data[$key]] = isset( $temp[$data[$key]]) ? $temp[$data[$key]] : ($last_key === $i ? $value : array());
$temp =& $temp[$data[$key]];
}
}
return $newarr;
}
您可以看到它生成this output:
array(1) {
["NS1"]=>
array(2) {
["NS1A"]=>
array(2) {
[2812]=>
string(6) "active"
[2811]=>
string(6) "active"
}
["NS1B"]=>
array(1) {
[2718]=>
string(6) "active"
}
}
}