• 一次请求对多条数据进行排序的算法(二)


    序号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");
        } 
  • 相关阅读:
    Nginx入门
    Spring基础知识汇总 Java开发必看
    java ArrayList倒序
    1
    js event 的target 和currentTarget
    java 文件的写入和读取
    DOMContentLoaded与load的区别
    JS中先有Object还是先有Function?
    JSON.stringify的三个参数
    Java的泛型约束和限制
  • 原文地址:https://www.cnblogs.com/godok/p/6215765.html
Copyright © 2020-2023  润新知