2011-06-20 4 views
5

別の配列の連続した再帰的キーに対応する配列を持っている場合、その "path"に値を代入する最良の方法は何ですか?例えば任意のディープアレイインデックスに割り当てますか?

:今、$some_arrayは現時点で

array(
    'a' => array(
    'b' => array(
     'c' => 'some value' 
))) 

に等しくなければならない、私は以下を使用しています

$some_array = array(); 
$path = array('a','b','c'); 
set_value($some_array,$path,'some value'); 

明らか
function set_value(&$dest,$path,$value) { 
    $addr = "\$dest['" . implode("']['", $path) . "']"; 
    eval("$addr = \$value;"); 
} 

を、これは非常にナイーブでありますアプローチし、セキュリティ上のリスクを負うので、どうすればよいでしょうか?

+1

パスが無効な場合はどうなりますか? – Matthew

+0

@konforce - 上記の例のように、 '$ some_example'が空になると、それは割り当てられます。 –

+0

私はそれを反映するために私の答えを更新しました。また、文字列値を配列で上書きすることもできますが、その動作が望ましくない場合は変更するのが簡単です。 – Matthew

答えて

2

再帰溶液(テストしていません):

function set_value(&$dest,$path,$value) { 
     $index=array_shift($path); 
     if(empty($path)){ 
     // on last level 
     $dest[$index]=$value; 
     } 
     else{ 
     // descending to next level 
     set_value($dest[$index],$path,$value); 
     } 
    } 
2

うわー、Lispのを思い出させます。

はい、evalは一般的には最適ではありません。

個人的に

、私は単純に反復するでしょう:あなたはPHP 5にいる場合は、おそらくあまりにもそれらの '&' のいくつかのキーを使用して動作するように更新

+1

あなたは '$ val [$ i]'を持っているところで '$ val [$ path [$ i]]'を意味しますか? – Matthew

+0

ああ!かなり正しい。私はそれを修正した。ありがとうございました。 – cwallenpoole

2
function set_value(&$dest, $path, $value) 
{ 
    # allow for string paths of a/b/c 
    if (!is_array($path)) $path = explode('/', $path); 

    $a = &$dest; 
    foreach ($path as $p) 
    { 
    if (!is_array($a)) $a = array(); 
    $a = &$a[$p]; 
    } 

    return $a = $value; 
} 


set_value($a, 'a/b/c', 'foo'); 

をRDを得ることができます

function set_value(&$dest,$path,$value) { 
    $val =& $dest; 
    for($i = 0; $i > count($path) - 1; $i++) { 
    $val =& $val[$i]; 
    } 

    $val[$path[$i]] = $value; 
} 

まだ存在しない配列と文字列パスのどちらかを受け入れることができます。

2
function set_value(&$dest, $path, $value) { 
    $dest = array(array_pop($path) => $value); 
    for($i = count($path) - 1; $i >= 0; $i--) { 
     $dest = array($path[$i] => $dest); 
    } 
} 
関連する問題