【问题标题】:Recursive array map from multidimentional array来自多维数组的递归数组映射
【发布时间】: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。
  • 是的,无限循环是可能的,因此需要在每次结果递归期间取消设置使用的数组元素。

标签: php arrays recursion


【解决方案1】:

这里是如何工作的检查下面的例子:

<?php

$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;


/// generate array key 
$array_keys=array();
foreach($level as $key1 =>$values)
{
    foreach($values as $key2 => $values2)
    {
        $array_keys[]=$key1.'-'.$key2;

    }

}


/// split array parent and childrent on diffrent parts
$parent='A1';
$parent_keys=array();
$children_keys=array();
foreach($level as $key =>$val)
{


    foreach($val as $key2 =>$val2)
    {
        if($key == $parent)
        $parent_keys[$key.'-'.$key2]=true;
        else
            $children_keys[$key.'-'.$key2]=true;


    }




}

$last_array=array();
foreach($parent_keys as $key =>$va)
{

    $exp=explode('-',$key);


    foreach($children_keys as $key2 =>$va2)
    {
            $arrunique=array();
        if(!strchr($key2,$exp[1])){
        $exp2=explode('-',$key2);

        foreach($exp as $r)
        {
            $arrunique[$r]=$r;

        }

        foreach($exp2 as $r)
        {
            $arrunique[$r]=$r;

        }
        if(in_array($exp[1].'-'.$exp2[0],$array_keys))
        $last_array[implode('-',$arrunique).'-'.$exp[0]]=true;


        }


    }



}

foreach($last_array as $key=>$va)
{

    print $key."\n";


}

您可以从沙盒中执行:LINK

【讨论】:

  • 谢谢。关闭,但它需要是一个递归函数,因为它可能有更多的值,并且可以超过 3 个 foreach 循环深度。
猜你喜欢
  • 2017-12-28
  • 2017-11-28
  • 2019-02-20
  • 2017-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多