PHP实现灵活排序
背景
我平时的工作是做数据报表,近期产品提了个需求,要把报表的指标顺序灵活调整。原先的排序是按自增id排序,现在要批量的灵活调整就有点麻烦了,基于现有的自增id只能每次都手动重刷,对于工程师来说这么笨的方法自然是无法接受的,所以就想用单链表的数据结构实现,只需要调整几个指向就可以实现灵活排序。
实现
实现过程其实挺简单,表结构只要增加两列:sort、sort_next
sort用来做自然升序控制,因为id可能是有间隔的。
sort_next用来做指针,指向下一个指标。
SQL查询只用保证按sort字段排序就可以了。
select * from table order by sort;
接下来就是关键的程序逻辑
function findRow($array, $id)
{
foreach ($array as $current_row) {
if ($current_row['sort'] === $id)
return $current_row;
}
return null;
}
function whatTheHeckSort($array)
{
$result = [];
$keep_next = [];
$last = $array[count($array) - 1];
for ($i = 0; $i < count($array); $i++) {
$working_record = $array[$i];
// 如果已经找过了,就不再找了
if (!isset($keep_next[$working_record['sort_next']])) {
array_push($result, $working_record);
}
$j = $i;
while ($working_record['sort_next'] !== null) {
// 如果已经找过了,就不再找了
if (isset($keep_next[$working_record['sort_next']])) {
break;
}
$row = findRow($array, $working_record['sort_next']);
// 保存已经找过的next
$keep_next[$working_record['sort_next']] = 1;
if ($row === null) {
$i = $j;
break;
}
$j++;
array_push($result, $row);
$working_record = $row;
}
$i = $j;
}
return $result;
}
whatTheHeckSort方法返回的就是排序后的指标数组了,只是这个算法不忧,后续还可以再优化。
搞定!!!!
海报
0 条评论
118
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~