For循环中的唯一随机整数

时间:2017-03-03 21:50:09

标签: php arrays random

我试图访问嵌套数组中的4个随机条目。到目前为止,我已经提出了这个代码:

$section = array_rand($acc);  // Create random array
$index = count($acc);         // Array Size
echo '<div><ul>';
for ($i = 0; $i < 4; $i++) {  // fetch 4 elements of array randomly
    $index = rand ( 0 , $index ); // generate random index
    echo '<li>';
    echo '<a>'.$acc[$index]['title'].'</a>';
    echo '<span>';
    echo $acc[$index]['content'];
    echo '</span>';
    echo '</li>';
}
echo '</ul></div>';

当然,问题在于每次循环都会产生一个随机数,但不能保证它在循环的前一次迭代中不会是相同的数字。

还有其他方法可以解决这个问题吗?

目标是将4个独特的随机数组嵌套在随机选择的数组中。

4 个答案:

答案 0 :(得分:0)

您需要一个数组或一个对象来跟踪唯一性。当数组中的数字匹配时(您之前使用过该数字),然后跳过逻辑并再次使用另一个随机数循环。

答案 1 :(得分:0)

一个基本的解决方案是保留先前生成的随机整数的列表,并在碰撞时生成新的随机整数。例如:

  1. 绘制1,不在列表{}中,使用它
  2. 绘制2,不在列表{1}中,使用它
  3. 绘制另一个1,在列表{1,2}中,不要使用它,再次绘制
  4. 画一个3,而不是列表{1,2,3}
  5. 另一个解决方案,如果您需要整个列表,则非常有用,是制作列表的副本,然后随机选择并删除元素并将其添加到随机列表中。一遍又一遍地执行此操作,直到副本为空。这是改组的“52卡取件”方法。

    我确信谷歌的一些时间会提供更正式的探索,可能会有更好的解决方案。

答案 2 :(得分:0)

也许做这样的事情:

<?php
$numIndexes = count($acc);
$usedIndexes = array();

echo '<ul>';

for ($i = 0; $i < 4; $i++) { 

    do{
        $index = rand ( 0 , $numIndexes ); 
    }
    while(!in_array($index, $usedIndexes));

    echo '<li>';
    echo '<a>'.$acc[$index]['title'].'</a>';
    echo '<div>';
    echo $acc[$index]['content'];
    echo '</div>';
    echo '</li>';

    $usedIndexes[] = $index;
}

echo '</ul>';
echo '</div>';

这未经过测试,但应该有效......

答案 3 :(得分:0)

这将最多选择4个随机密钥,然后使用它们。如果您的密钥少于4个,那么它将选择所有密钥。

$keys = array_rand($acc, min(4, sizeof($acc)));

echo '<div><ul>';
foreach($keys as $key) {
    echo '<li>';
    echo '<a>'.$acc[$key]['title'].'</a>';
    echo '<span>';
    echo $acc[$key]['content'];
    echo '</span>';
    echo '</li>';
}
echo '</ul></div>';