嵌套数组路径作为变量

Nested array path as variable

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

因此我们为我们的函数提供一个包含 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()
  )
)

那怎么办?

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

您可以使用更简单的方法,只需将 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]);

演示:https://3v4l.org/tjMRa