递归调用

来源:互联网 发布:淘宝iphone7可信度 编辑:程序博客网 时间:2024/06/04 19:54

大家还有别的思路没有

下面是我写的两个递归函数,最终的目的是构造一个表格。我也不知道怎么想的,反正糊里糊涂的写了写,试了试就出来了。

想要感觉自己摸到了递归的边角,重新梳理一下:

function recursionConstructRelation(array $arr, &$result, $index = 0)    {        ++$index;        if (empty($result)) {            $result = $arr[0];        }        $result = array_flip($result);        if (isset($arr[$index])) {            foreach ($result as $key => $v) {                $result[$key] = $arr[$index];                recursionConstructRelation($arr, $result[$key], $index);            }        }        return $result;    }    function recursionConstructRows($src, &$dest, array $inKeys = array(), $element = "G")    {        if ($element != "G") {            array_push($inKeys, $element);        }        foreach ($src as $key => $value) {            if (is_array($value)) {                recursionConstructRows($value, $dest, $inKeys, $key);            } else {                $dest[] = array_merge($inKeys, array($key));            }        }        return $dest;    }

原始的数据结构是这样的,它本身是一个二维数组:

$source = array(    array(        "玫瑰红",        "金色",        "活力蓝"    ),    array(        "全网通(6GB 64GB)",        "全网通(4GB 64GB)",        "全网通(6GB 128GB)"    ),    array(        "官方标配",        "套餐一",        "套餐二"    ),)

我最后希望得到的数据结构是下面这样的(我想生成一个table,通过控制rowspan属性来让运营方便明确的添加这个属性的sku信息)。

$dest = array(    array("玫瑰红", "全网通(6GB 64GB)", "官方标配"),    array("玫瑰红", "全网通(6GB 64GB)", "套餐一"),    array("玫瑰红", "全网通(6GB 64GB)", "套餐二"),    array("玫瑰红", "全网通(4GB 64GB)", "官方标配"),    array("玫瑰红", "全网通(4GB 64GB)", "套餐一"),    array("玫瑰红", "全网通(4GB 64GB)", "套餐二"),    array("玫瑰红", "全网通(6GB 128GB)", "官方标配"),    array("玫瑰红", "全网通(6GB 128GB)", "套餐一"),    array("玫瑰红", "全网通(6GB 128GB)", "套餐二"),    //......省略)

第一步我考虑建立三个属性的关系,我想先建立这样的关系,将数组变换成下面的形式:

$relation = array(    "玫瑰红" => array(        "全网通(6GB 64GB)" => array(            "官方标配" => "0",            "套餐一" => "1",            "套餐二" => "2"        ),        "全网通(4GB 64GB)" => array(            "官方标配" => "0",            "套餐一" => "1",            "套餐二" => "2"        ),        "全网通(6GB 128GB)" => array(            "官方标配" => "0",            "套餐一" => "1",            "套餐二" => "2"        )    ),    //....省略)

第一个递归函数用来将数据格式整理成上述结构。正常的执行流程应该是:

$index = 0;$firstPropertys = $resource[$index];$firstPropertys = array_flip($firstPropertys);      //反转key和value$index++;if (isset($resource[$index])) {    foreach ($firstPropertys as $key => $v) {        $firstPropertys[$key] => $resource[$index];    }}
  1. 退出递归的条件就是resource[index]不存在
  2. 将结果保存在引用变量中

第二个递归函数最终实现了我想要的结果,正常的流程简化如下:

foreach ($relation as $firstK => $firstV) {    foreach ($firstV as $secondK => $secondV) {        foreach ($secondV as $thirdK => $thirdV) {            $dest[] = array($firstK, $secondK, $thirdV)        }    }}
  1. 退出递归的时候需要生成table表的每一行数组
  2. 在每最后一层循环时,需要获取其他层的keys数组,且这个数组应该是值传递

最终的结构就类似于下列:
image

原创粉丝点击