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

序号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");
    } 
原文地址:https://www.cnblogs.com/godok/p/6215765.html