首页 / PHP / php – Gap填写优先级列保持顺序
php – Gap填写优先级列保持顺序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Gap填写优先级列保持顺序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3613字,纯文字阅读大概需要6分钟。
内容图文
![php – Gap填写优先级列保持顺序](/upload/InfoBanner/zyjiaocheng/785/c78969edc3544ddbabe4759762b55e07.jpg)
是否有任何好的算法可以“填补”表中优先级(或任何其他)列的空白?
例如
例
我有一个表,结构如下:
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
它是alrgiht,但我需要一个能够自行重新排序所有内容的函数,所以我不必手动更改优先级列的值.所以优先级列以1开头.
间隙以id 8,4开始排.
此外,更改漫画类别,然后将其更改回来,它会变得一团糟,会有正确的顺序,但它看起来不像我期望的那样好(出于管理目的).
有任何想法吗?伪代码或逻辑会很好.
编辑 – 解决方案:伪代码逻辑
由于我们知道类别中的行数,因此我们可以按优先级排序选择,这样我们就可以为每个“新”优先级分配正确的数字.
例如:
ordered select返回优先级如下:1,4,5,9,10
count(select)= 5
所以“新”优先级必须如下:1,2,3,4,5.只需在foreach循环中分配新值即可.
因为它在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]
解决方法:
UPDATE表为tb1,表为tb2 SET tb2.priority = tb2.priority – 1 WHERE tb2.priority> tb1.priority AND tb1.text =’action’AND tb2.subcategory = tb1.subcategory;
这应该解决差距,每个具有更高id的项目应该将其降低1
即你在这个子类别中:
| priority |
| 1 |
| 2 |
| 3 |
| 4 |
如果您移动优先级= 2的项目
3和4将移动为2和3
P.S.:这是仅针对差距的解决方案,因为移动问题已在另一个答案中得到解决.它应该在移动之前完成,因为子类别会在它之后发生变化,并且不会满足WHERE子句(旧子类别中的项目)
关于重新排序随机差距:
假设我们有优先事项:
5,10,11,12,18,20
我们想做的是:
1,2,3,4,5,6
所以这里的最大数量是20,需要标记为6
完成后,最大数量将为18,即5.
因此,每次使用UPDATE … SET … WHERE priority = MAX(优先级)时,它将获得最大优先级.
这是我的简单测试:
<?php
for ($i = 6; $i>=1; $i--) {
echo "UPDATE table SET priority = $i WHERE priority = MAX(priority) AND subcategory = X;" . "<br/>";
}
?>
产生:
UPDATE table SET priority = 6 WHERE priority = MAX(priority) AND subcategory = X; // 20 becomes 6
UPDATE table SET priority = 5 WHERE priority = MAX(priority) AND subcategory = X; // 18 becomes 5
UPDATE table SET priority = 4 WHERE priority = MAX(priority) AND subcategory = X; // 12 becomes 4
UPDATE table SET priority = 3 WHERE priority = MAX(priority) AND subcategory = X; // 11 becomes 3
UPDATE table SET priority = 2 WHERE priority = MAX(priority) AND subcategory = X; // 10 becomes 2
UPDATE table SET priority = 1 WHERE priority = MAX(priority) AND subcategory = X; // 5 becomes 1
因此,您需要在选择子类别的位置进行SELECT,将其替换为“X”,然后需要计算while循环的行数:
for ($i = $count_rows; $>=1; $i++) { ...
当然,您需要将语句放在正确的查询函数中,而不是回显它,但它是出于测试目的.
内容总结
以上是互联网集市为您收集整理的php – Gap填写优先级列保持顺序全部内容,希望文章能够帮你解决php – Gap填写优先级列保持顺序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。