2

在我的 php 脚本中,我有一个变量 $data ,其中包含一个可能有不同数量元素的数组。

该脚本随机选择一个数组元素并将其输出到浏览器:

# count number of elements in $data
$n = count($data);

# pick a random number out of the number of elements in $data
$rand = rand(0, ($n - 1));

# output a random element
echo '<p> . trim($data[$rand]) . '</p>';

问题:我想改进该脚本,使其在数组元素用完之前不会再次输出相同的数组元素。例如,如果一个数组包含编号为 0 到 9 的元素,并且脚本选择了一个数组元素 #4,我希望它记住这一点,并在下次运行脚本时排除 #4 的元素。

它可能可以通过许多不同的方式完成,但我正在寻找最简单和最优雅的解决方案,并感谢 PHP 专家的帮助。

4

4 回答 4

2

保存已在用户会话中选择的号码。

session_start();
$n = count($data); 

// If the array isn't initialized, or we used all the numbers, reset the array
if( !isset( $_SESSION['used_nums']) || count( $_SESSION['used_nums']) == $n) {
    $_SESSION['used_nums'] = array();
}

do{ 
    $rand = rand(0, ($n - 1));
} while( isset( $_SESSION['used_nums'][$rand]));

echo '<p>' . trim($data[$rand]) . '</p>';    
$_SESSION['used_nums'][$rand] = 1;

或者,也许是更聪明的方式,使用array_intersect_keyand array_rand

session_start();
$n = count($data); 

// If the array isn't initialized, or we used all the numbers, reset the array
if( !isset( $_SESSION['used_nums']) || count( $_SESSION['used_nums']) == $n) {
    $_SESSION['used_nums'] = array();
}

$unused = array_intersect_key( $data, $_SESSION['used_nums'];
$rand = array_rand( $unused);

echo '<p>' . trim($unused[$rand]) . '</p>';    
$_SESSION['used_nums'][$rand] = 1;
于 2013-01-21T05:24:11.883 回答
2

您可以对数组进行洗牌,然后简单地对其进行迭代:

shuffle($data);
foreach ($data as $elem) {
    // …
}

如果您不想更改数组顺序,您可以简单地打乱数组的键:

$keys = array_keys($data);
shuffle($keys);
foreach ($keys as $key) {
    // $data[$key]
}
于 2013-01-21T06:12:26.927 回答
1

您可以使用会话来存储您目前使用的索引。试试这个。

session_start();

$used = &$_SESSION['usedIndexes'];

// used all of our array indexes
if(count($used) > count($data)) 
    $used = array();

// remove the used indexes from data
foreach($used as $index)
    unset($data[$index]);

$random = array_rand($data);

// append our new index to used indexes
$used[] = $random;

echo '<p>', trim($data[$random]) ,'</p>';
于 2013-01-21T05:24:26.597 回答
0
$selection=$x[$randomNumber];
unset($x[$randomNumber]);
于 2013-01-21T05:22:23.980 回答