【发布时间】:2015-06-02 15:49:50
【问题描述】:
如何在 PHP 中对数组进行随机播放,但在插入或删除元素时保持随机播放的顺序,就像 mysql order by rand(seed) 一样? 一种忽略数组长度的Fisher-Yates shuffle算法。
假设您有一个包含 A、B、C 的数组并运行以下代码:
SELECT *
FROM (
SELECT 'A' AS value
UNION
SELECT 'B' AS value
UNION
SELECT 'C' AS value) AS T order by rand(123)
结果将是 B、C、A。
现在如果你将 D 添加到元素列表中:
SELECT *
FROM (
SELECT 'A' AS value
UNION
SELECT 'B' AS value
UNION
SELECT 'C' AS value
UNION
SELECT 'D' AS value) AS T order by rand(123)
结果将是 D、B、C、A。
将元素 E 添加到列表中:
SELECT *
FROM (
SELECT 'A' AS value
UNION
SELECT 'B' AS value
UNION
SELECT 'C' AS value
UNION
SELECT 'D' AS value
UNION
SELECT 'E' AS value) AS T order by rand(123)
结果将是 D、B、C、E、A。
当您将元素“D”添加到数组时,Fisher-Yates 将提供完全不同的顺序,而 rand(seed) 的 mysql 顺序将在已经随机排序的列表中的某处插入元素“D”。
【问题讨论】:
-
您的意思是:您获取初始列表并“随机播放”。然后,作为单独的步骤,您插入或删除“随机位置”中的项目,但不再重新排列列表?
-
您能分享一下您想要实现的目标吗?
-
假设我有 80 个高级汽车销售列表,每页显示 10 个。我需要它们全天随机(种子=当天),但是当客户添加新列表时,我想保持相同的随机顺序并在其他列表中插入新列表而不给新元素更多权重,否则所有客户会删除/插入他们的列表以到达顶部。