如果数组值彼此匹配,则再次进行洗牌

时间:2015-10-26 11:24:06

标签: php arrays

我有一个表单,用户可以在7个不同的字段中输入数字然后使用

shuffle($_POST);

混合数字,然后根据他们最初输入的数字显示它们,所以输出如下:

1 1
2 4
3 6
4 2
5 7
6 3
7 5

以下是我正在使用的代码。

<?php 
error_reporting(0);
if ($_SERVER['REQUEST_METHOD']== "POST") {
$array = implode("",$_POST);
shuffle($_POST);
}
?>
<div class="box"><?php echo $array[0]; ?> <?php echo $_POST[0]; ?></div><br>
<div class="box"><?php echo $array[1]; ?> <?php echo $_POST[1]; ?></div><br>
<div class="box"><?php echo $array[2]; ?> <?php echo $_POST[2]; ?></div><br>
<div class="box"><?php echo $array[3]; ?> <?php echo $_POST[3]; ?></div><br>
<div class="box"><?php echo $array[4]; ?> <?php echo $_POST[4]; ?></div><br>
<div class="box"><?php echo $array[5]; ?> <?php echo $_POST[5]; ?></div><br>
<div class="box"><?php echo $array[6]; ?> <?php echo $_POST[6]; ?></div><br>

如何相互检查两个数组值以确保它们不匹配。如果他们匹配,那么我想再次使用shuffle(),直到其中一个匹配。我可能会使用if else语句再次运行代码,直到数字不匹配但不确定如何进行。

3 个答案:

答案 0 :(得分:3)

在while循环中检查array_intersect_assoc($array,$_POST);,直到它返回null数组,随机播放!

使用array_intersect_assoc()

$array = $_POST;
do {
    shuffle($_POST);

} while ((count(array_intersect_assoc($array, $_POST))) !=0);

答案 1 :(得分:1)

您可以编写一个辅助函数来测试数组是否匹配,然后随机播放,直到没有匹配为止。

function has_same_matches($arr1, $arr2) {
    for($i=0, $sz = count($arr1); $i < $sz; ++$i) {
        if ($arr1[$i] == $arr2[$i]) return true;
    }
    return false;
}

$array = [1,2,3,4,5,6,7];
$shuffled = $array;

while(has_same_matches($array, $shuffled)) {
    shuffle($shuffled);
}

答案 2 :(得分:1)

我不确定你为什么要直接使用$ _POST,但无论如何我觉得这个灵魂应该适合你。 另请注意,shuffle()不保留数组键。

if ($_SERVER['REQUEST_METHOD']== "POST") {
    $init_array = $_POST;
    $array = implode("",$_POST); //user input
    shuffle($_POST);
    $after_shuffle = $_POST;
    while($init_array == $after_shuffle){
       shuffle($_POST);
    }
    $final_array = $_POST; //array with unmatched values
 }