1

我创建了一个函数,它根据另外两个数组的值和键返回一个嵌套数组,并将第三个值分配给最深的键(希望它对代码有意义):

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(),我想知道是否有更好的方法,更优雅或更快。

4

2 回答 2

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;
}
于 2012-07-13T12:51:22.563 回答
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;
}

你可以看到它产生了这个输出

array(1) {
  ["NS1"]=>
  array(2) {
    ["NS1A"]=>
    array(2) {
      [2812]=>
      string(6) "active"
      [2811]=>
      string(6) "active"
    }
    ["NS1B"]=>
    array(1) {
      [2718]=>
      string(6) "active"
    }
  }
}
于 2012-07-13T12:44:30.407 回答