2012-03-11 37 views
0

我有一个数组,其中有18个值,我使用$array[rand(0,17)]选择了随机值。我将这些随机选择的值在页面上彼此相邻放置。在数组中有6组值,我不想在页面上彼此相邻放置。有没有什么办法可以检测出这些线对是否在一起,并选择新的值,因为这样做可以使用当从数组中选择随机值时,确保两个确定的值不会出现在一起

+0

你是什么意思的“套价值”? – Neil 2012-03-11 21:29:37

+0

想象一下你有一个包含四个单词的数组:一两两三。我希望它是这样的,一个和两个不能在页面上彼此相邻 – Amja 2012-03-11 21:49:46

回答

1

警告:你确实知道你不会在没有可能的数组排序的情况下得到任何退化的情况吗?例如,如果你不允许对[1,2]或[2,1],你得到的数组是[1,1,1,1,1,1,1,1,1,2,2 ,2,2,2,2,2,2,2],你运气不好。没有办法以你想要的方式显示数组,下面描述的方法永远不会终止。


我会同时使用shuffle($array),然后遍历洗牌后的数组一个项目,以找出任何值是否为“不兼容”与之前的项目。如果是这样,只需重新洗牌阵列,然后再试一次。你无法预测需要多少次尝试才能得到一个可以工作的混洗数组,但所花费的时间应该可以忽略不计。

要检测两个值是否兼容,我建议制作一个包含所有不兼容对的数组。例如,如果你不希望有连续对1和3或2和5,那么你的数组将是:

$incompatible = array(
    array(1,3), 
    array(2,5)); 

然后你会遍历您的洗牌阵列类似:

for ($i=1; i<count($array)-1; i++;) { 
    $pair = $array[i, i+1]; // this is why the for loop only goes to the next-to-last item 
    if in_array($pair, $incompatible) { 
     // you had an incompatible pair in your shuffled array. 
     // break out of the for loop, re-sort your array, and try again. 
    } 
} 
// if you get here, there were no incompatible pairs 
// so go ahead and print the shuffled array! 
+0

谢谢。这真的很有帮助 – Amja 2012-03-11 22:08:34

0

或与unset()一起使用,以删除键或由Session使用下一个跳过。

+0

我不知道我将如何impliment。为了使它更简单,让我们使用这样的数组:array('First','Second','Third','Fourth');我想要做的是不允许第一次和第二次或第三次和第四次在被随机选择后回显出来时彼此相邻 – Amja 2012-03-11 21:30:53

+0

这个答案与这个问题有什么关系?你们有没有分享一些我们其他人不知道的背景知识(比如家庭作业)? – 2012-03-11 21:51:18

相关问题