0

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

“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>';
}

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

4

1 回答 1

1

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

  1. 使用两个数组:returnhighPriority. return不会在乎重量,而highPriority会。
  2. 遍历您的给定列表,并将所有 0 权重放入return,将所有其他权重放入highPriority.
  3. 按重量排序highPriority,从低到高。
  4. 对于 中的每个项目highPriority,数学运算很容易,但来​​自典型的“标准化和缩放”操作:标准化权重 ( 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]

注意事项:

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

那应该让你继续前进。希望能帮助到你!

于 2013-04-16T14:24:39.543 回答