嵌套数组路径作为变量[duplicate]

问题描述 投票:1回答:1

我正在使用递归函数构建关联数组,这涉及通过每个实例将值推入键的嵌套数组的路径

因此,我们向函数提供一个包含3个键的基本数组,其中空数组作为值

$fooArray = array(2 => array(), 14 => array(), 8 => array());
$ids = array(2, 14, 8);
function test($fooArray, $ids) {

我们的递归函数首先循环这些ID,检查每个ID的子ID,然后将填充有值的数组添加到键中

$subids = array(5, 8, 9);
$subkeys = array_fill_keys($subids, array());
$fooArray[$id] = $subkeys;

在第二次运行递归函数时,我们遍历新添加的键子集并重新运行该过程。问题是我丢失了父路径。

现在我可以通过函数将第一个$ id作为父ID发送,然后推送

$fooArray[$pid][$id] = $subkeys

但是现在我要进行第三和第四次跑步吗?我需要的是一种构建路径并通过每个功能进行传递的方法

$path = $fooArray[$pid][$id];
$path = $fooArray[$pid][$pid][$id];

这是我的最佳尝试

function rcr(&$fooArray, $ids, $path, $i = 0) {
   if ($ids and count($ids) > 0) {
     foreach( $ids as $id ) {
         $subids = // function that gets our array of subids
         $subkeys = array_fill_keys($subids);
         if ($i == 0) {
            $fooArray[$id] = $subkeys;
            $path = &$fooArray[$id];
         } else {
            $path[$id] = $subkeys;
            $path = &$path[$id];
         }
         $s = $i + 1;
         function rcr($fooArray, $subids, $path, $s);
     }
  }
}

function get_rcr() {
   $fooArray = array(2 => array(), 14 => array(), 8 => array());
   $ids = array(2, 14, 8);
   $path = "";
   rcr($fooArray, $ids, $path, $i = 0);
   return $fooArray;
}

但是在第二次运行该函数时,$ path [$ id]无法添加到主$ fooArray中

期望的结果是

array(
  [2] => array(
      [5] => array(
          [7] => array(
               [46] => array()
          )
      ),
      [108] => array()
  ), 
  [14] => array(),
  [8] => array(
      [72] => array()
  )
)

那又如何?

php recursion associative-array
1个回答
1
投票

我不确定我是否完全理解了这个问题,但是可以理解。

您可以通过使用更简单的方法,只需将ID数组作为参数并在以下位置填充数组:

  • 每个键是ID,
  • 并且每个值都是基于该ID的子ID的下一次迭代的结果。

功能:

function rcr(array $ids): array
{
  $array = [];
  foreach ($ids as $id) {
    $array[$id] = rcr(getSubIds($id));
  }
  return $array;
}

getSubIds是获取ID的子ID的其他函数。这是您的示例之后的虚拟实现:

function getSubIds(int $id): array
{
  switch ($id) {
    case 2: return [5, 108];
    case 5: return [7];
    case 7: return [46];
    case 8: return [72];
    default: return [];
  }
}

用法:

$result = rcr([2, 14, 8]);

Demo:https://3v4l.org/tjMRa

© www.soinside.com 2019 - 2024. All rights reserved.