有没有什么好的算法可以“填补”表格优先级(或任何其他)列的空白?例如
例子
我有一个结构如下的表:
id | text | subcategory | priority
它是这样填充的
1 | books | NULL | 1
2 | dvds | NULL | 2
5 | action | 2 | 1
8 | romantic | 2 | 2
9 | fantasy | 1 | 1
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
在我的设计中,有一个更改子类别的选项,如果发生这种情况,优先级设置为“新”优先级,并且其值在当前所在的子类别中最高。
例如,
将“action (id:5)”子类别更改为“books ( id:1)”,它的优先级是 4,没关系,但是现在“浪漫 (id:8)”行的优先级为 2,并且它是 1,并且仅在子类别 dvds (id:2) 中。
1 | books | NULL | 1
2 | dvds | NULL | 2
8 | romantic | 2 | 2
9 | fantasy | 1 | 1
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
5 | action | 1 | 4
-> 我将幻想 (id:9) 子类别更改为 dvds (id:2),我的优先级将是 3。
1 | books | NULL | 1
2 | dvds | NULL | 2
8 | romantic | 2 | 2
9 | fantasy | 2 | 3
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
5 | action | 1 | 4
没关系,但是我需要一个可以自行重新排序所有内容的函数,因此我不必手动更改优先级列的值。所以优先级列从 1 开始。
间隙从 id 8、4 开始。此外,更改漫画类别,然后将其改回来,它会很乱,会有正确的顺序,但它看起来不像我预期的那么好(出于管理目的)。
有任何想法吗?伪代码或逻辑会很好。
编辑-解决方案:伪代码+逻辑
由于我们知道类别中的行数,我们可以进行选择,将按优先级排序,因此我们可以为每个“新”优先级分配正确的数字。
例如:
有序选择返回优先级如下:1、4、5、9、10
count(select) = 5
所以“新”优先级必须如下:1、2、3、4、5。只需在 foreach 循环中分配 new价值的关键。
因为它在 codeigniter 中:
$this->category_model->getPriorities("2") 在我的案例 2 中按一个子类别的顺序 (ASC) 为您提供所有优先级。
public function prioritize(){
$p = $this->category_model->getPriorities("2");
for ($i = 1; $i < count($p)+1; $i++) {
echo "new[".$i."]->id[".$p[$i-1]->id."]->old_value[".$p[$i-1]->priority."]<br>";
}
}
输出:
new[1]->id[9]->old_value[1]
new[2]->id[13]->old_value[3]
new[3]->id[14]->old_value[5]
new[4]->id[15]->old_value[8]
new[5]->id[11]->old_value[10]