先想象一下,排序号是固定的,就好像有十把椅子,每个椅子都是固定在那里的,移动的是上面的人,这样就不会影响到其他页面的数据了
而且每个人换的也是之前其他人的桌椅号码,这样也不用去想到底要加多少才能排在哪里。
// 保证查找出来的数据跟前台提交的顺序一致,这里要order by field
// id 主键 sort 排序值
$ids = '1,2,3,4';
// 想要最终实现为 1,4,2,3 【下标是从0计算的】
$old_index = 3; // 原始下标, 4 所在下标为 3
$new_index = 1; // 新下标
$sql = "select id,sort from 表名字 where id in ($ids) order by field(id, " . $ids . ") ";
$list = "这里省略,就是执行数据库查询找嘛";
// 重新排序
$new_info = sorts($info, $old_index, $new_index);
/**
* 根据起始位置结束位置实现拖拽排序
* @param $list array 原始需要排序的数组数据
* @param $oldIndex int 排序数据原始位置
* @param $newIndex int 排序数据新的位置
* @return array
*/
function sorts(array $list, int $oldIndex, int $newIndex): array
{
$idArr = [];
$sortArr = [];
//数据库数据
foreach ($list as $item) {
$idArr[] = $item['id'];
$sortArr[] = $item['sort'];
}
//记录要拖动的id
$oldValue = $idArr[$oldIndex];
//删除这个要拖动的id
unset($idArr[$oldIndex]);
//插入新的位置,并自动移位
array_splice($idArr, $newIndex, 0, $oldValue);
//重新设置排序
$set = [];
for ($i = 0; $i < count($idArr); $i++) {
$set[$i]['id'] = $idArr[$i];
$set[$i]['sort'] = $sortArr[$i];
}
//返回排序后的数据
return $set;
}