6

假设我有以下功能

function setArray(&$array, $key, $value)
{
    $array[$key] = $value;     
}

上面的函数中,key只有一级,如果我想在2级或3级设置key,怎么改写函数呢?

例如

 $array['foo']['bar'] = 'test';

我想使用相同的函数来设置数组值

4

5 回答 5

15

这个应该可以的。使用此函数,您可以通过传递包含由分隔的键的单个字符串来设置任何深度的任何数组元素.

function setArray(&$array, $keys, $value) {
  $keys = explode(".", $keys);
  $current = &$array;
  foreach($keys as $key) {
    $current = &$current[$key];
  }
  $current = $value;
}

您可以按如下方式使用它:

$array = Array();
setArray($array, "key", Array('value' => 2));
setArray($array, "key.test.value", 3);
print_r($array);

输出:

Array (
    [key] => Array
        (
            [value] => 2
            [test] => Array
                (
                    [value] => 3
                )

        )

)
于 2012-11-13T11:10:58.557 回答
1

您可以使用array_merge_recursive

$array = array("A" => "B");
$new['foo']['bar'] = 'test';
setArray($array, $new);
var_dump($array);

输出

array (size=2)
  'A' => string 'B' (length=1)
  'foo' => 
    array (size=1)
      'bar' => string 'test' (length=4)

使用的功能

function setArray(&$array, $value) {
    $array = array_merge_recursive($array, $value);
}
于 2012-11-13T11:12:24.400 回答
1

这个函数应该这样做,键应该是一个数组,例如 array('foo', 'bar')

function setArray(&$array, array $keys, $value) {
  foreach($keys as $key) {
    if(!isset($array[$key])) {
      $array[$key] = array();
    }
    $array = &$array[$key];
  }
  $array = $value;
}

$arr = array();
setArray($arr, array('first', 'second'), 1);
var_dump($arr);
// dumps array(1) { ["first"]=> array(1) { ["second"]=> int(1) } } 

测试和工作。

于 2012-11-13T11:23:57.810 回答
0

使用array_replace_recursive代替,array_merge_recursive因为它可以正确处理相同键的场景。请参阅此https://3v4l.org/2ICmo

于 2017-09-28T10:11:54.417 回答
-1

像这样:

function setArray(&$array, $key1, $key2, $value)
{
    $array[$key1][$key2] = $value;     
}

但是为什么要使用函数呢?像这样使用它:

setArray($array, 'foo', 'bar', 'test');

需要更多时间来写这样的东西:

$array[1][2] = 'test';
于 2012-11-13T11:08:30.520 回答