尝试检索嵌套键数组值,给定未知数量的提供键到 PHP 函数
Attempt to retrieve nested key array value given unkown amount of supplied keys into PHP function
我想提供一个带有一组键(未知数量)和一个值的函数,然后设置相应的嵌套数组值(使用这些键和值)。我知道如何进行检索,而不是分配。对于检索,我这样做:
function test($keys, $value){
$arr = ["key1" => ["key2" => true], "key3" => true];
$nestedArrayValue = $arr;
foreach($keys as $key){
$nestedArrayValue = $arr[$key];
}
return $nestedArrayValue;
}
但是在赋值时,$nestedArrayValue
是一个副本,所以它实际上不会改变$arr
。同样,如果我要通过引用传递 $nestedArrayValue = &$arr
,foreach 每次都会覆盖整个 $arr
。例如:
function test($keys, $value){
$arr = ["key1" => ["key2" => true], "key3" => true];
$nestedArrayValue = &$arr;
foreach($keys as $key){
$nestedArrayValue = $arr[$key];
}
$nestedArrayValue = $value;
var_dump($arr);
}
test(["key1", "key2"], "test value");
//OUTPUT:
string(10) "test value"
整个 $arr
被覆盖(它应该)。我的问题是:如何在给定未知数量的键(作为数组)的情况下直接分配给 $arr
?可能吗?
更新:
这是我正在尝试做的伪代码示例:
// If this is supplied into function:
["key1","key2"]
// Then this is attempted to be returned:
$arr["key1"]["key2"];
我想出了怎么做 ^ 那个,但我似乎无法弄清楚如何做到这一点:
// If this is supplied for keys:
["key1","key2"]
// And if this is supplied as value:
"test value"
// Then it should attempt to set:
$arr["key1"]["key2"] = "test value"
这可能吗?
您将 $nestedArrayValue
引用设置为数组,并在循环中实际将整个数组替换为值 $arr[$key]
。有必要更改对下一个键的引用:
$nestedArrayValue = &$arr;
foreach($keys as $key){
// $nestedArrayValue = $arr[$key];
$nestedArrayValue = &$nestedArrayValue[$key];
}
$nestedArrayValue = $value;
检查密钥是否存在也很好:
$nestedArrayValue = &$arr;
$found = true;
foreach($keys as $key){
if (array_key_exists($key, $nestedArrayValue)) {
$nestedArrayValue = &$nestedArrayValue[$key];
} else {
$found = false;
break;
}
}
if ($found) {
$nestedArrayValue = $value;
}
我想提供一个带有一组键(未知数量)和一个值的函数,然后设置相应的嵌套数组值(使用这些键和值)。我知道如何进行检索,而不是分配。对于检索,我这样做:
function test($keys, $value){
$arr = ["key1" => ["key2" => true], "key3" => true];
$nestedArrayValue = $arr;
foreach($keys as $key){
$nestedArrayValue = $arr[$key];
}
return $nestedArrayValue;
}
但是在赋值时,$nestedArrayValue
是一个副本,所以它实际上不会改变$arr
。同样,如果我要通过引用传递 $nestedArrayValue = &$arr
,foreach 每次都会覆盖整个 $arr
。例如:
function test($keys, $value){
$arr = ["key1" => ["key2" => true], "key3" => true];
$nestedArrayValue = &$arr;
foreach($keys as $key){
$nestedArrayValue = $arr[$key];
}
$nestedArrayValue = $value;
var_dump($arr);
}
test(["key1", "key2"], "test value");
//OUTPUT:
string(10) "test value"
整个 $arr
被覆盖(它应该)。我的问题是:如何在给定未知数量的键(作为数组)的情况下直接分配给 $arr
?可能吗?
更新:
这是我正在尝试做的伪代码示例:
// If this is supplied into function:
["key1","key2"]
// Then this is attempted to be returned:
$arr["key1"]["key2"];
我想出了怎么做 ^ 那个,但我似乎无法弄清楚如何做到这一点:
// If this is supplied for keys:
["key1","key2"]
// And if this is supplied as value:
"test value"
// Then it should attempt to set:
$arr["key1"]["key2"] = "test value"
这可能吗?
您将 $nestedArrayValue
引用设置为数组,并在循环中实际将整个数组替换为值 $arr[$key]
。有必要更改对下一个键的引用:
$nestedArrayValue = &$arr;
foreach($keys as $key){
// $nestedArrayValue = $arr[$key];
$nestedArrayValue = &$nestedArrayValue[$key];
}
$nestedArrayValue = $value;
检查密钥是否存在也很好:
$nestedArrayValue = &$arr;
$found = true;
foreach($keys as $key){
if (array_key_exists($key, $nestedArrayValue)) {
$nestedArrayValue = &$nestedArrayValue[$key];
} else {
$found = false;
break;
}
}
if ($found) {
$nestedArrayValue = $value;
}