zoukankan      html  css  js  c++  java
  • 一次请求对多条数据进行排序的算法(二)

    序号order从1开始的递增整数,无间断无重复

    为保证序号不间断、无重复,每次修改数据的序号后,都要对其他的数据序号进行顺移。
    同时移动多条数据是指保证序号不间断、无重复的情况下,移动数据到指定位置。

    移动流程

    1.把数据移动到指定位置(修改序号)
        标记一个空位(数据原来的位置序号)
        标记一个重复位(数据移动后的位置序号)
    2.对空位和重复位排序
    3.移动每对空位和重复位之间的数据
        空位大于重复位:下移
        空位小于重复位:上移

    示意图1:

    php实例

    //要移动的数据
    $rows = array(
        array(
            "id"=>3,/*唯一标识*/
            "moveto"=>8/*目标位置*/
        ),
        array(
            "id"=>4,
            "moveto"=>9
        ),
        array(
            "id"=>12,
            "moveto"=>2
        )
        ...
    )
    $kong = array();//空位
    $chong = array();//重复位
    $locked = array();//锁定数据
    foreach($rows as $row){
        $locked[] = $row[$id];
        $kong[] = $o = $db->result("SELECT order FROM ".DB_TABLEPRE."user WHERE  id=$row[$id] ");//数据原来的位置o
        $chong[] =  $n = $row[moveto];//目标位置n
        $db->query("update user set order=$n  WHERE  id= ".$row[$id]);//移动该条数据
    }
    sort($kong);
    sort($chong);
    foreach($kong as $i=>$k){
        $c = $chong[$i];
        if($k == $c){
            //不移动
        }elseif($k > $c){
            //下移
            $db->query("update user set order=order+1  WHERE  id NOT IN(implode(',',$locked))  AND order<=$k AND order>=$c");
        }else{
            //上移
            $db->query("update user set order=order-1  WHERE  id NOT IN(implode(',',$locked))  AND order>=$k AND order<=$c");
        } 
  • 相关阅读:
    23.safari history.back的一个坑
    22.一个小小的广播效果
    UI13-GET POST 同步,异步-代理 Block请求方式。
    UI11-数据解析:Json DOM SAX 解析
    UI10-通讯录
    UI-09 cell 高度自适应)
    UI06-scrollView 滚动视图 pagecontroll 页面控制
    UI05-‍手势用图片做实验
    UI04-NSTimer 打地鼠
    UI03-viewController 视图跳转:
  • 原文地址:https://www.cnblogs.com/godok/p/6215765.html
Copyright © 2011-2022 走看看