创建具有间隔插入的加权项的数组

时间:2013-04-15 21:38:46

标签: php jquery

我正在开发一个用于客户大厅的留言板。

“rundown”是从PHP创建的JSON,每5分钟通过一次AJAX调用检查更新。从包含项目,持续时间以及开始和停止时间的MySQL数据库填充纲要。 JQuery遍历内容然后循环到数据的开头。目前列表中没有重复的项目。

已经请求了一个加权系统,这样当一个重要的项目($$$客户,员工会议等)出现时,它会更频繁地出现在列表中(而不是只发生一次,直到循环发生)。

我已经在数据库中添加了一个权重列,但我在查找如何在最终的数组构建中实现它时遇到了麻烦:

$i = 0;
foreach ($rundown_standard as $item) {
            $return[$i]["playlist_id"] = $i;
            $return[$i]["item_id"] = $item["id"];
            $return[$i]["weight"] = $item["weight"];
            $return[$i]["duration"] = $item["duration"];
            $return[$i]["template"] = $item["template"];
            $return[$i]["headline"] = htmlentities($item["headline"]);

        $content = $helper->isJson($item["content"]);
        if ($content) {
            $return[$i]["content"] = $content; 
        } else { 
            $return[$i]["content"] = str_replace(array('{images_path_absolute}', '{images_path_relative}'), array(IMAGES_PATH_ABSOLUTE, IMAGES_PATH_RELATIVE), $item["content"]);
        }

    i++;
}

$return是我发送到调用此函数的函数的格式化数据。

默认权重为0,这意味着它只应按照添加到数组中的顺序显示一次,权重为90的内容应显示在每个其他项目之后。

我已尝试设置另一个计数器变量然后插入项目并重置计数器,这只适用于一个加权项目,但不适用于多个加权项目

清除泥土?

感谢您的任何建议。

编辑17:45:JavaScript只是动态更新页面;迭代JSON并将下一个项目附加到列表中:

if (window.item_content[i].template == "1") {
    return '<div class="featured-item" id="featured-item-'+window.item_content[i].playlist_id+'"><img src="'+window.item_content[i].content+'" /></div>';
}

这是我的问题所在的数组,如果要插入多个元素,我应该如何以指定的间隔插入元素。

1 个答案:

答案 0 :(得分:1)

听起来你知道如何编码,只需要一个算法,所以我会给你一些伪代码。如果你需要我把它变成更好的代码,我可以这样做。

  1. 使用两个数组:returnhighPriorityreturn不会关心体重,highPriority会。{/ li>
  2. 遍历您的给定列表,并将所有0个权重放入return,将所有其他权重放入highPriority
  3. 对重量进行排序highPriority,从最低到最高。
  4. highPriority中的Foreach项目,数学结果很简单,但来自典型的“规范化和缩放”操作:标准化权重(n = weight / 90),然后将其缩放到大小数组(n *= return.length)的数量,以查找要添加到数组中的项目数。然后,要查找在return数组中分配项目所需的空间,您可以执行return.length / n。不过,这简单地归结为90/weight

    1. var step = 90 / item.weight;
    2. for (var i = 0; i <= 90; i += step) place item at i[step]
  5. 注意事项:

    • 我们从零权重开始,因为它们的优先级低,只需要存在一次。
    • 对于所有其他人,由于他们的体重较高,我们会在阵列的前面处启动它们。
    • 我们计算的step将针对每个元素进行更改,因为return.length在每次迭代中都会发生变化,但由于我们最后添加了最高优先级,因此它们仍将获得最高优先级。
    • 我们使用i <= 90确保这些加权值至少出现两次。如果只有i < 90,且重量为1,我们最终只能得到一个项目,而权重1应该与权重0不同。
    • 我还没有完全检查出这个算法。在计算步骤时,我们可能需要一些Math.floorMath.ceiling。检查边缘情况(比我更好)!

    这应该让你去。希望它有所帮助!