是否有任何好的算法,可以「填補」優先級(或任何其他)列表的差距? 例如差距填入優先級列+保持秩序
例如
我有一個結構如下表:
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,即可,但現在「romantic(id:8)」行優先級爲2,並且它是唯一的子類別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)子類別到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
這是alrgiht,但我需要一個函數這將自行重新排序所有內容,所以我不必手動更改優先級列的值。所以優先列從1開始。
差距從第8行開始,第4行開始。 此外更改漫畫類別,然後將其更改回來,它會變得雜亂,會有正確的順序,但它不會看起來像我期望(用於管理目的)。
任何想法? 僞代碼或邏輯會很好。
編輯 - 解決方案:僞代碼+邏輯
因爲我們知道在類的行數,我們可以做一個選擇是要通過優先級排序,這樣我們就可以分配適當數量的每個「新」優先。
例如:
有序select返回優先級如下:1,4,5,9,10
計數(選擇)= 5
所以 「新」 的優先級必須如下:1,2,3, 4,5.只需在foreach循環中分配新值即可。
自笨:
$這個 - > category_model-> getPriorities( 「2」),讓你所有優先級排序(ASC)一個子類的在我的情況2.
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]
我會盡力幫忙,但首先我需要得到邏輯。優先級是什麼,以及爲什麼當改變4號行動的優先級時,它的子類別也改變了?或者它是一個反轉的依賴性,您正在更改子類別(因此books和dvd是類別?) –
yep正如您可以看到的子類別是每個在子類別列中都有NULL的行,優先級僅用於在網站菜單上排序。 如果更改子類別,優先級更改爲新值:value =新子類別+1中的最高值優先級。(我在這裏發佈的這張表格組成了我的有點大,這張表格解釋了問題的目的) – Kyslik