0

我有一个网站,我想在上面显示项目。这些项目以下列格式存储在数据库中:

ID  Item    Active
1   My item 0
2   My item 1
7   My item 1
8   My item 1
10  My item 0

请注意,ID 不一定是均匀分布的。每个项目要么是活动的(1)要么是不活动的(0)。我希望一次激活 3 个项目,每次调用我的脚本时,我都希望下一个项目变为活动状态,而最旧的项目变为非活动状态,如下所示:

ID  Item    Active
1   My item 0
2   My item 0
7   My item 1
8   My item 1
10  My item 1

所以:

ID  Item    Active
1   My item 1
2   My item 0
7   My item 0
8   My item 1
10  My item 1

我目前正在努力考虑上述第三种情况的算法。我不能只选择处于活动状态的最高 ID 并移至下一个项目并将其设置为活动状态,同时选择处于活动状态的最低 ID 并使其处于非活动状态。

到目前为止,这是我的代码:

{
            for ($i=0;$i<sizeof($videos);$i++)
        {
            echo $i."]";
            
            if ($videos[$i]->active == 1)
            {
                if (!isset($first_active))
                {
                    echo "mooh";
                    echo "[";
                    echo $first_active = $i;
                    echo "]";
                }
                
                if ( ($i < (sizeof($videos)-1)) && ($videos[$i+1]->active == 0) )
                {
                    $videos[$i+1]->active = 1;
                    $videos[$i+1]->update();
                    
                    echo "@".$first_active."|".$videos[$first_active]->id()."@";
                    $videos[$first_active]->active = 0;
                    $videos[$first_active]->update();
                    
                    $first_active = null;
                    
                    echo "|".$videos[$i+1]->id();
                    break;
                }
                elseif ($i == (sizeof($videos)-1))
                {
                    $videos[0]->active = 1;
                    $videos[0]->update();
                    
                    $videos[$first_active]->active = 0;
                    $videos[$first_active]->update();
                    
                    $first_active = null;
                    
                    echo "|".$videos[0]->id();
                    break;
                }
            }
        }
    }

这一直有效,直到我走到最后,例如 ID 10。然后它正确地使 ID 1 处于活动状态。在下一次调用中,它使 ID 7 处于活动状态,而 ID 1 处于非活动状态。

知道如何 1) 修复我的代码,2) 更聪明地解决这个问题吗?

4

1 回答 1

2

在我看来,您实际上需要存储上次激活日期而不是简单的开/关标志。

您可以使用两个数据库查询,一个按 ID 顺序获取完整列表,另一个专门仅获取按活动日期排序的前 3 个条目。遍历您的完整列表以按顺序获取所有条目,然后使用您的 3 个活动的 ID 测试每个条目的 ID,以测试它当前是否处于活动状态。然后,将新项目设置为活动状态就像更新所需项目上活动列的日期/时间一样简单。

如果您真的想保留活动的开/关标志,那么就这样做,只需使用最后一个活动日期/时间制作另一列。

于 2013-09-20T20:21:06.403 回答