我有一个字符串:
$string = 'one/two/three/four';
我将其转换为一个数组:
$keys = explode('/', $string);
这个数组可以有任意数量的元素,例如1、2、5等。
如何在多维数组中分配特定的值,但使用上面创建的数组$keys
来识别要插入的位置?
例如:
$arr['one']['two']['three']['four'] = 'value';
抱歉如果问题有点令人困惑,但我不知道怎样更好地解释它。
我有一个字符串:
$string = 'one/two/three/four';
我将其转换为一个数组:
$keys = explode('/', $string);
这个数组可以有任意数量的元素,例如1、2、5等。
如何在多维数组中分配特定的值,但使用上面创建的数组$keys
来识别要插入的位置?
例如:
$arr['one']['two']['three']['four'] = 'value';
抱歉如果问题有点令人困惑,但我不知道怎样更好地解释它。
这是有关IT技术的内容。
function insert_using_keys($arr, $keys, $value){
// we're modifying a copy of $arr, but here
// we obtain a reference to it. we move the
// reference in order to set the values.
$a = &$arr;
while( count($keys) > 0 ){
// get next first key
$k = array_shift($keys);
// if $a isn't an array already, make it one
if(!is_array($a)){
$a = array();
}
// move the reference deeper
$a = &$a[$k];
}
$a = $value;
// return a copy of $arr with the value set
return $arr;
}
$string = 'one/two/three/four';
$keys = explode('/', $string);
$arr = array(); // some big array with lots of dimensions
$ref = &$arr;
while ($key = array_shift($keys)) {
$ref = &$ref[$key];
}
$ref = 'value';
这段代码的作用是:
$ref
来跟踪对$arr
当前维度的引用。$keys
,引用当前引用的$key
元素。$keys
包含0或NULL会怎样? - Mark Elliot$arr
不是一个数组时,您的解决方案会“惨败”,还有其他一些情况。弹性的错误检查并不是正确答案的先决条件。 - FtDRbwLXw6$ref = &$ref['children'][$key]
添加进去,因为我需要所有子节点都在一个数组子节点中。 - jasie你需要先确保键存在,然后再分配值。类似这样的代码应该可以工作(未经测试):
function addValueByNestedKey(&$array, $keys, $value) {
$branch = &$array;
$key = array_shift($keys);
// add keys, maintaining reference to latest branch:
while(count($keys)) {
$key = array_pop($keys);
if(!array_key_exists($key, $branch) {
$branch[$key] = array();
}
$branch = &$branch[$key];
}
$branch[$key] = $value;
}
// usage:
$arr = array();
$keys = explode('/', 'one/two/three/four');
addValueByNestedKey($arr, $keys, 'value');
虽然有点老套,但是:
function setValueByArrayKeys($array_keys, &$multi, $value) {
$m = &$multi
foreach ($array_keys as $k){
$m = &$m[$k];
}
$m = $value;
}
$multi = $multi[$k]
创建了一个副本,而不是引用,所以当你执行 $multi = $value
时,你实际上并没有修改任何东西,除了最终的数组。 - Mark Elliot$multi
作为参数传递会生成一个副本,您分配给$m
的第一个引用是指向副本而不是原始数据。您可以(a)在参数列表中将$multi
设置为引用或(b)return $multi
。 - Mark Elliot $arr['one']['two']['three']['four'] = 'value';
$string = 'one/two/three/four';
$ExpCheck = explode("/", $string);
$CheckVal = $arr;
foreach($ExpCheck AS $eVal){
$CheckVal = $CheckVal[$eVal]??false;
if (!$CheckVal)
break;
}
if ($CheckVal) {
$val =$CheckVal;
}
这将会返回数组中的值。