1

別の 2 つの配列の値とキーに基づいてネストされた配列を返し、3 番目の値を最も深いキーに割り当てる関数を作成しました (コードで意味があることを願っています)。

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 に答える