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

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

时间: 2024-10-29 12:37:50

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

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

业务数据库开发上线流程v1.0

XX业务数据库开发上线流程v1.0 草拟时间:2015.11.23制订时间:修订时间: 0x00 目的 本文定义了业务在开发上线发布过程中涉及的数据库相关流程,指引业务人员高效完成数据库上线工作,最终确保上线质量可控. 0x01 适用范围 人员:所有研发人员,运维人员数据库:业务所有MySQL 数据库 0x02 流程说明 流程内容包含:数据库申请-->功能开发---功能与性能测试-->提交审核-->运维审核--->上线变更---验证---上线结束 1. 数据库服务申请 流程负责人员

Android版本升级同时Sqlite数据库的升级及之前数据的保留

http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid=166052 做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已

数据库生成带框架、数据的脚本和还原数据库

我们在进行项目的过程中肯定需要做维护或者重构,这时我们要面对的就是别人的系统,如果前任是比较细心的人还好,他会将所有需要的信息都给你准备好,但是万一遇到粗心的前任的话就不好说了,最最可能的情况就是有代码,然后就没有然后了...... 众所周知我们做软件需要的是三项:代码.文档和数据库,往往人们只注重代码的实现而忽视了其他两项,数据库还好说毕竟我们会发布到服务器上,文档就难说了,所以提醒广大的工程师们,一定要将文档记在心中. 这篇文章就是这么来的--当被分到整理维护某个系统时发现数据库不在给的文件

python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用. 本节的代码:(Django 1.6, Python 2.7 测试环境) 大

ADO.NET——使用Connection连接数据库,使用DataReader访问数据库并返回多行数据

使用Connection连接数据库,使用DataReader访问数据库,并返回多行数据. 相关步骤: 需要引入两个命名空间 using System.Data; using System.Data.SqlClient; 使用DataReader访问数据库的步骤 创建SqlConnection对象,指定连接字符串 创建SqlCommand对象,指定与之相关的连接对象,以及数据库操作命令文本(CommandText) 打开连接 调用SqlCommand对象的ExecuteReader()方法,返回S

【转】Android版本升级同时Sqlite数据库的升级及之前数据的保留

做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段.并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;2 ALTER TABLE Sub

数据库1(数据库、表及表数据、SQL语句)

01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行增加,修改,删除及查询操作. B: 什么是数据库管理系统 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立.使用和维护数据库, 对数据库进行统一管理和控制,以保证数据库的安全性和完整性.用户通过数据库管理系统访问数据库中表内的数据. 02常见的数据库 * A: 常见的数据库

大数据开发学习步骤

经常有初学者 问我,自己想往大数据方向发展,该学哪些技术,学习路线是什么样的,觉得大数据很火,就业很好,薪资很高.如果自己很迷茫,为了这些原因想往大数据方向发展,也可以,那么我就想问一下,你的专业是什么,对于计算机/软件,你的兴趣是什么?是计算机专业,对操作系统.硬件.网络.服务器感兴趣?是软件专业,对软件开发.编程.写代码感兴趣?还是数学.统计学专业,对数据和数字特别感兴趣. 其实这就是想告诉你的大数据的三个发展方向,平台搭建/优化/运维/监控.大数据开发/设计/架构.数据分析/挖掘.请不要问