搞咯好几个小时,终于把流程步骤依据上下步骤排序搞定.
具体如下:
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);
PHP,从数据库获得的流程步骤数据按照上下步骤排序
时间: 2024-10-29 12:37:50