Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:从数组中进行非重复选择_Php_Arrays_Random - Fatal编程技术网

PHP:从数组中进行非重复选择

PHP:从数组中进行非重复选择,php,arrays,random,Php,Arrays,Random,在我的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 '<

在我的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>';
#计算$data中的元素数
$n=计数($data);
#从$data中的元素数中选择一个随机数
$rand=rand(0,($n-1));
#输出一个随机元素
回声'。修剪($data[$rand])”

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


可能有很多不同的方法可以实现,但我正在寻找最简单、最优雅的解决方案,非常感谢PHP专家的帮助

保存用户会话中已拾取的号码

$selection=$x[$randomNumber];
unset($x[$randomNumber]);
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;

您可以使用会话来存储迄今为止使用过的索引。试试这个

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>';
session_start();
$used=&$_会话['usedIndex'];
//使用了我们所有的数组索引
如果(计数($used)>计数($data))
$used=array();
//从数据中删除已使用的索引
foreach($用作$索引)
未设置($data[$index]);
$random=数组随机($data);
//将新索引附加到已使用的索引
$used[]=$random;
回显“”,修剪($data[$random]),“

”;
您可以洗牌数组,然后简单地在其上迭代:

shuffle($data);
foreach ($data as $elem) {
    // …
}
如果不想改变数组顺序,可以简单地洗牌数组的键:

$keys = array_keys($data);
shuffle($keys);
foreach ($keys as $key) {
    // $data[$key]
}

这仍然存在两次使用同一索引的可能性。@Austinbrunkhost为什么这样认为?因为OP希望在每次加载页面时都选择一个随机的、唯一的索引。可能有一种方法不仅可以洗牌顺序,还可以取消已选择的顺序?这行得通吗?@DimitriVorontzov您可以对无序排列的数组键执行相同的操作,将其存储在更持久的存储器中,并在显示时从数组中删除该键。对于第二个示例,您需要echo
trim($unused[$rand])
$keys = array_keys($data);
shuffle($keys);
foreach ($keys as $key) {
    // $data[$key]
}