Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在优先级列中填充间隙+保持顺序_Php_Mysql_Codeigniter - Fatal编程技术网

Php 在优先级列中填充间隙+保持顺序

Php 在优先级列中填充间隙+保持顺序,php,mysql,codeigniter,Php,Mysql,Codeigniter,是否有任何好的算法可以填补优先级或表中任何其他列的空白? e、 g 实例 我有一个表,其结构如下所示: 例如,它是这样填充的 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 在我的设计中,有一个更改子类别的选项

是否有任何好的算法可以填补优先级或表中任何其他列的空白? e、 g

实例 我有一个表,其结构如下所示:

例如,它是这样填充的

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
在我的设计中,有一个更改子类别的选项,如果发生这种情况,优先级将设置为新优先级,并且它的值在它当前所在的子类别中是最高的。例如 将操作id:5子类别更改为books id:1,其优先级为4,这是可以的,但现在浪漫id:8行具有优先级2,并且它是子类别DVD 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
->我将fantasy id:9子类别更改为DVD 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
它是alrgit,但我需要一个函数,将重新排序的一切本身,所以我不必手动改变优先列的值。所以优先级列以1开头

间隙从id为8、4的行开始。 此外,改变漫画类别,然后改变回来,这将是所有的混乱将有正确的秩序,但它不会像我期待的行政目的好

有什么想法吗?伪代码或逻辑会更好

编辑-解决方案:伪代码+逻辑 因为我们知道类别中的行数,所以我们可以选择按优先级排序的行,这样我们就可以为每个新优先级分配正确的编号

e、 g: 有序选择返回的优先级如下:1、4、5、9、10 countselect=5 因此,新的优先事项必须如下:1、2、3、4、5。只需在foreach循环中为value分配新的键

由于其在codeigniter中: $this->category_model->getPriorities2在我的案例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>";    
        }
}

将表更新为tb1,将表设置为tb2.priority=tb2.priority-1,其中tb2.priority>tb1.priority和tb1.text='action'和tb2.subcategory=tb1.subcategory

这应该可以解决差距,每一个id较高的项目应该减少1

i、 e.您在该子类别中有:

| priority |
|   1      |
|   2      |
|   3      |
|   4      |
如果移动优先级为2的项目

3和4将作为2和3移动

附言:这只是解决差距的办法,因为搬家问题已经在另一个答案中解决了。它应该在移动之前完成,因为子类别将在移动之后更改,并且不会满足WHERE子句的要求,即从旧子类别中删除项目

关于随机间隙的重新排序:

假设我们有优先权:

5,10,11,12,18,20

我们希望将其制作为:

1,2,3,4,5,6

这里的最大数字是20,需要标记为6

完成后,最大数量将为18,即5

所以每次你使用更新。。。设置其中priority=MAXpriority,它将获得最大优先级

以下是我的简单测试:

<?php
for ($i = 6; $i>=1; $i--) {
    echo "UPDATE table SET priority = $i WHERE priority = MAX(priority) AND subcategory = X;" . "<br/>";
}
?>
因此,您需要在选择子类别的位置进行选择,将其置于X而不是X,然后需要计算while循环的行数:

for ($i = $count_rows; $>=1; $i++) { ...

当然,您需要将语句放在正确的查询函数中,而不是重复它,但这是出于测试目的。

我会尽力提供帮助,但首先我需要获得逻辑。优先权是做什么的?为什么在更改行动ot 4的优先权时,其子类别也会更改?或者,这是一种反向依赖关系,您正在更改子类别,使书籍和DVD成为类别?是的,正如您可以看到的,子类别是子类别列中每一行都有空值,优先级仅用于在站点菜单上排序。如果更改子类别,优先级将更改为新值:值=新子类别中的最高值优先级+1。我在这里发布的这张表是由我的表组成的,这张表更大一些,这张表解释了问题的目的这已经解决了,我试图找到解决办法来填补子类别变化过多造成的空白。正如你们在我的例子中看到的,在优先级列中有一个空白,浪漫的类别应该有优先级1而不是优先级2。我的意思是我可以手动改变它,但我需要一个算法,它可以自己完成这项工作。这就是你需要的:在的最后一个回复排序中的解决方案。非常好的便条谢谢。记住优先级列有它的用途,在任何更改之后,它必须有它的初始顺序!你提供的链接不是问题的解决方案,但它帮助很大。但你可以将其用于任何专栏。我知道我理解它,我正在寻找填补空白+保持订单。这就是问题的重点。很好,这应该是我的问题的一个解决方案,但让我们概括一下,如果有人希望算法填补空白,并且仍然具有相同的顺序,该怎么办?我的意思是暂时忘记改变类别和所有那些东西。这是没有必要的差距将只有1个数字更高。优先级可以是5、10、11、12、18、20,现在我想把它改为1、2、3、4、5、6:我知道你明白,但我正在寻找这个答案。用纯SQL来实现它可能需要一段时间。然而,我想到php中的SimpleFor循环,我会编辑答案,请参阅我的编辑;在codeigniter中也做了同样的事情。@Royal Bg:是的,不是
t关于sql及其与php的结合…尼斯:很高兴看到它对您来说一切正常,并希望新用户将其用作注释:
| priority |
|   1      |
|   2      |
|   3      |
|   4      |
<?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
for ($i = $count_rows; $>=1; $i++) { ...