PHP,从数据库获得的流程步骤数据按照上下步骤排序

搞咯好几个小时,终于把流程步骤依据上下步骤排序搞定.

具体如下:

1. 从数据库获取某一类型的流程步骤数据...

但是这个数据有可能会出现死循环,因为再进行添加的时候不是很好判断,但可以肯定的就是不可能让下一步为自己本身.

2. 可以知道流程的入口在哪里,也就是说,知道第一步的ID是什么样子的.

3. 流程的ID次序是打乱的,也就是说你不可能按照ID来直接循环找值.

解决思路

1. 已知数据库内容$a,以及第一步为1,判断是否有下一步,没有直接返回第一步;

2. 整理$a,让$a的第一个key为1,也就是说第一个key为第一步.

3. 生成一个$a的键值数组,并提取其个数(这里的键值是不能重复的)

4. 生成需要返回的流程数组第一个key为第一步

5. 设定临时值为第一步,为循环键值数组是判断做准备.

6. 循环键值数组

7, 循环从第二个key开始,找到下一步在当前键值数组的位置.

8. 判断找到下一步,并将临时值为下一步的值,生成返回流程数组的第一个key为第一步,这里是重写第一步,后面循环则是追加

9. 将下一步的值与键值数组的下一次循环起始位对调,保证是从下一次循环是从下一次的第一步开始.

 

目前测试过下面几种情况,都不会报错,但是代码貌似有点点长,或者是没有找到捷径.

1. 死循环, 2.乱序的数据库内容, 3. 不同的key对应相同的下一步.

 

详细代码如下:

<?php

$a = array(
    7 => 7,
    1 => 11,
    8 => 7,
    9 => 8,
    10 => 11,
    11 => 8,
    12 => NULL,
);
var_dump($a);
$firstID = 1;
$nextID = 11; //这里程序可以找到是11
//将第一位提前
$newReturnTemp[$firstID] = $nextID;
if (empty($nextID)) {
        return array($a[$firstID]);
} else {
        //重新组建数组,并让开始为为第一位
        foreach ($a as $key => $value) {
                $newReturnTemp[$key] = $value;
        }
        unset($key);
        unset($value);
        //获取数组的数目
        $stepCount = count($a);
        //提取所有键值
        $stepArray = array_keys($newReturnTemp);
        //让判断位为第一位
        $temp = $firstID;
        //组件要返回的数组第一位
        $newnew[$firstID] = $nextID;
        //将键值进行循环
        for ($i = 0; $i < $stepCount; $i++) {
                //默认从第一步开始,
                if ($temp == $stepArray[$i]) {
                        //键值数组循环后面的值
                        for ($j = $i + 1; $j < $stepCount; $j++) {
                                //判断是否找到下一级的值,依据$a的内容
                                if ($newReturnTemp[$stepArray[$i]] == $stepArray[$j]) {
                                        //找到值,写入需要返回的数组
                                        $newnew[$temp] = $stepArray[$j];
                                        //设定下一个判断值
                                        $temp = $stepArray[$j];
                                        //将键值循环的下一位与当前所返回的下一级值对换,并保证下一次判断是从下一级开始
                                        $tt = $stepArray[$j];
                                        $stepArray[$j] = $stepArray[$i + 1];
                                        $stepArray[$i + 1] = $tt;
                                        unset($tt);
                                }
                        }
                }
        }
        //将返回排序好的数组,并依据排队内容一次取出相对应的数据,这里是用$a来做演示的...
        foreach ($newnew as $key => $value) {
                $reReturn[$key] = $a[$key];
                $last = $value;
        }
        //将默认最后一位没有找到的值或者是不正确的下一级补进数组...(可以不需要这一步)
        if (isset($a[$last])) {
                $reReturn[$last] = $a[$last];
        }
}

var_dump($reReturn);

 

posted on 2014-07-04 23:31  Kaka Zhou  阅读(187)  评论(0编辑  收藏  举报

导航