我正在使用递归函数构建关联数组,这涉及通过每个实例将值推入键的嵌套数组的路径
因此,我们向函数提供一个包含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数组作为参数并在以下位置填充数组:
功能:
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]);