PHP通过键在多维数组中插入数据

时间:2019-06-21 11:42:36

标签: php arrays recursion multidimensional-array

我正在尝试将数据插入多维数组,但这让我很挣扎。我做不到对我来说真是令人困惑。

我有一个“树”数组:

$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个三维分支之一中。

我会在这里输入我已经完成的工作,但还不算太多。我不知道是否应该选择递归函数来执行此操作或其他方式。

谢谢。

3 个答案:

答案 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 referenceforeach一起使用

$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);

DEMO

方法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);

Php demo