【问题标题】:Weekly shuffle of array每周洗牌数组
【发布时间】:2011-09-19 08:55:34
【问题描述】:

我有一组 4 个 HTML 列表项,我想改变它们每周出现一次的顺序。我想知道那里是否有人对此有一个很好、优雅的解决方案?

与往常一样,我非常感谢您提供的任何意见!

更新:

不幸的是,即使有必要的 .htaccess 覆盖,我也无法让任何基于 srand() 的解决方案在这个特定的服务器上工作,但可以使用以下解决方案 - 目前,它只返回一个列表项 - 我如何修改它以显示所需的四个?再一次,任何想法都将不胜感激:)

function RandomList($TimeBase, $QuotesArray){

    $TimeBase = intval($TimeBase);

    $ItemCount = count($QuotesArray);

    $RandomIndexPos = ($TimeBase % $ItemCount);

    return $QuotesArray[$RandomIndexPos];

}

$WeekOfTheYear = date('W'); 

$RandomItems = array(
    "<li><a href=\"#northern-germany\" title=\"Northern Germany\">North</a></li>","<li><a href=\"#southern-germany\" title=\"Southern Germany\">South</a></li>","<li><a href=\"#western-germany\" title=\"Western Germany\">West</a></li>","<li><a href=\"#eastern-germany\" title=\"Eastern Germany\">East</a></li>");

print RandomList($WeekOfTheYear, $RandomItems);

【问题讨论】:

  • 我将发布一个答案,您应该在调用shuffle_array() 之前将周数用作srand() 的种子值。这将每周产生相同的排序顺序。不幸的是,这似乎不再可能了,因为播种是从 PHP 4.2.0 开始自动执行的 :(
  • @jensgram:这只是意味着它不再是必要,而不是不可能。 IE。您的解决方案将起作用。将其添加为答案。
  • @nikc 哦,好点。我只是假设种子总是被调用,但从未花时间验证。该实现已发布在另一个答案中,所以我不会费心写同样的内容:)(顺便说一句:我谈到了不存在的shuffle_array() 函数。显然,我的意思是shuffle(),cf cbrandolino 的答案。)
  • @nikc,实际上它很可能无法工作,因为 suhosin 补丁。详情见答案。
  • @cbrandolino:OP 从未提及 Suhosin 补丁。我在没有它的情况下对它进行了分期付款测试,效果很好。

标签: php arrays shuffle timed


【解决方案1】:

这是一个简单且 - 我猜 - 非常优雅的解决方案,它不涉及在数据库中存储值、设置 cronjobs 和其他类似的无聊东西。

假设您在$array 中有您的列表元素:

srand(date('W'));
shuffle($array);
srand();

现在你的数组被打乱了,并且会以同样的方式打乱直到下周一。

但这有一个问题:它不适用于 Suhosin 补丁(默认安装在 Debian 中)。不过,既然您了解了date('W'),那么您自己想出一个替代解决方案就很容易了。

编辑:如果您不想实现自己的伪随机数生成器,但安装了 Suhosin,则可以将以下行放入您的 .htaccess

php_value suhosin.srand.ignore 0

【讨论】:

  • 感谢您的回答-看起来不错,但是当我尝试时,似乎每次刷新页面时都会打乱列表项的顺序!有什么想法我可能做错了吗?
  • 你没有做错:你的 php 版本必须附带 Suhosin 补丁。查看编辑!
  • 除了使用 srand 外,您还可以按以周数为种子的哈希进行排序(如果需要,需要进行一些测试以确保偶数概率),或者您可以按索引的模数 + 周数进行排序旋转堆栈。
  • @symcbean:他也可以使用磁盘和磁针。您的解决方案会带来什么优势?
  • @cbrandolino:没有明显优势——只是指出解决问题的方法有多种。
猜你喜欢
  • 2015-04-15
  • 2014-03-07
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多