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

鑑於上述代碼,我怎樣才能在$first$second定義的$string內容的索引設置的值?這個例子的含義應該是$first["b"]["d"]["f"] = $string;,但$second$first的內容可以是任意長度。然而,$second將始終是一維。下面是我試過,這似乎並沒有按計劃工作:如何動態地訪問值在一個可變的多維陣列

$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

這比這更復雜一點。如果它還不存在,你必須初始化每個級別。但實際問題是:您要添加的就是價值$ptr,而不是在$first

  • 數組。
  • $x &= $y$x = $x & $y(按位與)的縮寫。你想要的是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