嵌套数组路径作为变量

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


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


$fooArray = array(2 => array(), 14 => array(), 8 => array());

$ids = array(2, 14, 8);

function test($fooArray, $ids) {

我们的递归函数从循环这些 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()

  )

)

又怎样?


侃侃无极
浏览 174回答 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]);演示:https ://3v4l.org/tjMRa
打开App,查看更多内容
随时随地看视频慕课网APP