嵌套数组路径作为变量
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]);
我正在使用递归函数构建关联数组,该函数涉及通过每个实例携带路径以将值推送到键的嵌套数组
因此我们为我们的函数提供一个包含 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]);