首页 > 代码库 > PHP,从数据库获得的流程步骤数据按照上下步骤排序

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