【问题标题】:php Insert data in multidimensional array by keysphp 按键向多维数组中插入数据
【发布时间】:2019-11-04 06:22:45
【问题描述】:

我正在尝试将数据插入多维数组,但这让我很吃力。我做不到。这让我很困惑。

我有一个“树”数组:

$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 维)。

请注意,插入将始终发生在树的最深分支之一。例如,如果树是一个三维数组,那么路径变量肯定会有 3 个值,并且插入将在数组可能具有的 n 个三维分支之一中。

我会在这里输入我所做的,但不是那么多。我不知道我应该选择递归函数还是其他方式。

提前致谢。

【问题讨论】:

  • 输入数组可以有更多的深度吗?喜欢4 => array( 1=>array(), 2=>array() ),
  • 是的,它可以有任何深度
  • 在这种情况下你将如何决定$path
  • 路径变量是已知数据。例如,在一个 4 维数组中,$path 应该类似于 array(11,2,5,7)。插入将始终位于树数组可能具有的 m 个分支之一的最深索引中

标签: php arrays recursion multidimensional-array


【解决方案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) {
    }
  }
}

【讨论】:

    【解决方案2】:

    方法一

    您可以将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

    方法二

    通过使用函数

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

    【讨论】:

      【解决方案3】:

      创建递归函数的另一个选项是存储类似面包屑的数组以跟踪当前路径的索引。然后将数组与路径数组进行比较,如果相等则赋值。

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-24
        • 2017-06-21
        • 2011-12-06
        • 2017-05-18
        • 1970-01-01
        • 2013-09-12
        • 2012-05-05
        • 2014-10-31
        相关资源
        最近更新 更多