2011-09-18 5 views
6
$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f")); 
$second = array("b", "d", "f"); 
$string = "foobar"; 

上記のコードが与えられていると、$secondで定義されたインデックスで$firstの値を$stringの内容に設定するにはどうすればよいですか?意味は、この例では$first["b"]["d"]["f"] = $string;でなければならないが、$second$firstの内容は任意の長さにすることができる。しかし、$secondは常に1次元です。ここで私が試したことは、計画どおりに動作していないようです:可変多次元配列の値に動的にアクセスする方法

$key = ""; 
$ptr = $first; 
for($i = 0; $i < count($second); $i++) 
{ 
    $ptr &= $ptr[$second[$i]]; 
    $key = key($ptr); 
} 
$first[$key] = $string; 

これは適切な多次元インデックスの代わりに$first["f"] = $string;を行います。私は、keyを使用すると、すでに移動したレベルを含む配列内の位置を見つけることができると考えていました。

どのようにして適切なキーに動的にアクセスできますか?次元の数が静的であれば、私はこれを管理することができました。

編集:また、私はevalを使用しないこれを行う方法をしたいと思います。

答えて

9

これはもう少し複雑です。すべてのレベルがまだ存在しなければ初期化する必要があります。しかし、あなたの実際の問題は次のとおりである:あなたがいない$firstで、$ptrであるために値を追加したい

  • 配列。
  • $x &= $yは、$x = $x & $y(ビット単位のAND)の略語です。あなたが望むものはx = &$y(参照によって割り当てます)です。

これはそれを行う必要があります。

function assign(&$array, $keys, $value) { 
    $last_key = array_pop($keys); 
    $tmp = &$array; 
    foreach($keys as $key) { 
     if(!isset($tmp[$key]) || !is_array($tmp[$key])) { 
      $tmp[$key] = array(); 
     } 
     $tmp = &$tmp[$key]; 
    } 
    $tmp[$last_key] = $value; 
    unset($tmp); 
} 

使用法:

assign($first, $second, $string); 

DEMO