序号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"); }