2015-07-11 74 views
0

嵌套数组的设定值可以说我有这样的代码:PHP:使用可变关键

$array = [ 
     'a'=> [ 
      'b' => [ 
       'c'=>'some value', 
      ], 
     ], 
    ]; 

    $array['a']['b']['c'] = 'new value'; 

当然这是工作,但我想要的是更新使用可变这个“C”键,这样的事情:

$keys = '[a][b][c]'; 
$array{$keys} = 'new value'; 

但键treatening为字符串,这就是我得到:

$array['[a][b][c]'] = 'new value'; 

所以我想一些帮助,向我展示如何在不使用eval()的情况下完成这项工作的正确方法。

顺便说一句,可以有任意数量的阵列巢的,所以这样的事情是不是一个很好的答案:

$key1 = 'a'; 
$key2 = 'b'; 
$key3 = 'c'; 
$array[$key1][$key2][$key3] = 'new value'; 

回答

1

它不是定义键的最佳方式,但:

$array = []; 
$keys = '[a][b][c]'; 
$value = 'HELLO WORLD'; 

$keys = explode('][', trim($keys, '[]')); 
$reference = &$array; 
foreach ($keys as $key) { 
    if (!array_key_exists($key, $reference)) { 
     $reference[$key] = []; 
    } 
    $reference = &$reference[$key]; 
} 
$reference = $value; 
unset($reference); 

var_dump($array); 

如果你有这样的字符串来定义键序列,那么它的简单只是使用简单的分离器可以爆炸,而不需要修剪,以及建立单独的按键阵列,这样更简单的东西像a.b.c会更容易比[a][b][c]

Demo

+0

多亏了工作,这就是我所需要的。是的,IAM使用join()函数将字符串定义为a.b.c,如果有人需要,可以使用代码: function keyArray($ array = [],array $ path = []){result = array(); ($ array as $ key => $ val){ $ currentPath = array_merge($ path,array($ key)); if(is_array($ val)){ $ result = array_merge($ result,keyArray($ val,$ currentPath)); } else { $ result [] = join('。',$ currentPath); } } return $ result; } –

0

嗨老兄,你可以做这样的throught键的数组:

这是你的阵列结构:

$array = array(
    'a'=> array(
     'b' => array(
      'c'=>'some value', 
     ), 
    ), 
); 

这是PHP代码从您的阵列,动态密钥获得价值:

$result = $array; //Init an result array by the content of $array 

$keys = array('a','b','c'); //Make an array of keys 

//For loop to get result by keys 
for($i=0;$i<count($keys);$i++){ 
    $result = $result[$keys[$i]]; 
} 

echo $result; // $result = 'new value' 

我希望这个答案对你有帮助,在这里找到你的工作代码PHPFiddle