【发布时间】:2018-12-11 08:55:36
【问题描述】:
我需要使用以下格式从多维数组构建所有可能性的地图:
$level['A1']['E1'] = true;
$level['E1']['A1'] = true;
$level['A1']['L1'] = true;
$level['L1']['A1'] = true;
$level['A1']['E2'] = true;
$level['E2']['A1'] = true;
$level['E1']['L1'] = true;
$level['L1']['E1'] = true;
$level['E1']['E2'] = true;
$level['E2']['E1'] = true;
结果需要在另一个从A1到A1的多维数组中有所有可能的映射,例如:
$level_maps['A1']['E1']['L1']['A1'] = true;
$level_maps['A1']['E1']['E2']['A1'] = true;
$level_maps['A1']['L1']['E1']['A1'] = true;
$level_maps['A1']['L1']['E1']['E2']['A1'] = true;
$level_maps['A1']['E2']['E1']['A1'] = true;
$level_maps['A1']['E2']['E1']['L1']['A1'] = true;
初始数组可能更大,我很难使用递归函数。
编辑:
我有一个具有以下功能的简单类:
private function buildMap(array $levels, $parent) {
$map = array();
foreach ($levels as $level1 => $level2_vals) {
foreach($level2_vals as $level2 => $val) {
if ($parent == $level1) {
$map[$level2] = true;
unset($levels[$level1][$level2]);
$level3 = $this->buildMap($levels, $level2);
if(!empty($level3) && $level2 != $this->end_level) {
$map[$level2] = $level3;
}
else if($level2 != $this->end_level) {
$map[$level2] = false;
}
}
}
}
return $map;
}
调用它:
$map[$this->start_level] = $this->buildMap($level, $this->start_level);
但它不能正常工作,尤其是在更大的关卡集上。 抱歉,如果我不清楚,我只是在寻找一个递归函数示例。
【问题讨论】:
-
我无法计算出您用来生成示例的规则,我猜这是一个不完整的示例?您能否提供一个完整示例,其中包含初始数组的较小子集?为什么有 4 个维度和一些 5 个维度?值是否总是
true? -
是的,它是不完整的 - 需要有所有可能的方式从 A1 到 A1 在父子关系中。最简单的结果集包括: $level_maps['A1']['E1']['A1'] = true; $level_maps['A1']['L1']['A1'] = true;等
-
但是在您的示例中,您会遇到无限循环吗? A1 -> E1 -> L1 -> A1 ->E1 -> L1 -> A1 等等。所以我认为我们需要更多信息。此外,您应该提供您所做的尝试以及其中出了什么问题,否则这只是一个理论练习。
-
我们可以假设结果总是正确的。在初始设置中,某些级别可能不可用,并且有类似 $level['E2']['D1'] = false; 的内容。但我们可以假设在这种情况下它们都是正确的。至于关卡地图——我有一个递归函数,如果在经过所有可能性后没有以初始 A1 结束,则将结果元素设置为 false。
-
是的,无限循环是可能的,因此需要在每次结果递归期间取消设置使用的数组元素。