PHP:在数组中旋转

时间:2013-09-20 20:08:04

标签: php list rotation

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

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处于非活动状态。

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

听起来像你实际上需要存储最后一个激活日期而不是简单的开/关标志。

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

如果你真的想要保持主动开/关标志,那么只需要创建另一个有最后一个活动日期/时间的列。