我正在尝试将数据插入多维数组,但这让我很挣扎。我做不到对我来说真是令人困惑。
我有一个“树”数组:
$tree = array(
10 => array(),
11 => array(
4 => array(),
5 => array(),
6 => array()
)
);
还有用于插入数据的路径数组:
$path = array(11,5);
结果应为:
$tree = array(
10 => array(),
11 => array(
4 => array(),
5 => array($data),
6 => array()
)
);
这必须与任何多维数组(n维)一起使用。
请注意,插入将始终在树的最深分支之一中进行。例如,如果树是三维数组,则path变量肯定会具有3个值,并且插入位置将在该数组可能具有的n个三维分支之一中。
我会在这里输入我已经完成的工作,但还不算太多。我不知道是否应该选择递归函数来执行此操作或其他方式。
谢谢。
答案 0 :(得分:1)
好吧,您只需要一个递归函数并使用ref传递的数组,就像...
$tree = [
10 => [],
11 => [
4 => [],
5 => [],
6 => []
]
];
$path = [
11,
5,
0
];
var_dump(insertIntoArr($tree, 'Awesome value', $path, $tree));
function insertIntoArr(&$chunk, $data, $path, &$original) {
$key = array_shift($path);
if (!empty($path)) {
if (!isset($chunk[$key])) {
throw new \Exception('OMG! This path does\'t exists, I can\'t continue...');
}
return insertIntoArr($chunk[$key], $data, $path, $original);
}
$chunk[$key] = $data;
return $original;
}
打印...
array(2) {
[10]=>
array(0) {
}
[11]=>
array(3) {
[4]=>
array(0) {
}
[5]=>
array(1) {
[0]=>
string(13) "Awesome value"
}
[6]=>
array(0) {
}
}
}
答案 1 :(得分:1)
方法1
您可以将pass by reference
与foreach
一起使用
$tree = [
10 => [],
11 => [
4 => [],
5 => [],
6 => []
]
];
$path = array(11,5,0);
$inseration = array('A','B');
$current = &$tree;
foreach($path as $key){
$current = &$current[$key];
}
$current = $inseration;
echo '<pre>';
print_r($tree);
方法2
通过使用功能
$tree = [
10 => [],
11 => [
4 => [],
5 => 'r',
6 => []
]
];
$path = array(11,5);
$inseration = [1,2];
insertByKey($tree, $path, $inseration);
function insertByKey(&$array, $path, $inseration){
$current = &$array;
$key = array_shift($path);
while($key > 0){
$current = &$current[$key];
$key = array_shift($path);
}
$current = $inseration;
}
答案 2 :(得分:1)
创建递归函数的另一种方法是存储类似面包屑的数组,以跟踪当前路径的索引。然后将数组与路径数组进行比较,如果它们相等,则分配值。
function setByIndices(&$tree, $path, $data, $indices = []) {
foreach ($tree as $k => &$v) {
$indices[] = $k;
if ($indices === $path) {
$v = $data;
return;
}
if (is_array($v)) setByIndices($v, $path, $data, $indices);
array_pop($indices);
}
}
setByIndices($tree, $path, $data);