如何在 php 洗牌中合并两个数组

How to combine two arrays in a php shuffle

我正在尝试创建一个随机播放功能,让人们配对交换礼物。我创建了它的基本 shell 并且不确定从这里到哪里去。我正在获取输出以打乱数据,但是我想组合 array_givearray_receive 变量,以便它会输出以下内容:

Paul 和 Becky 正在向 Keith 和 Jackie 捐款。

不过,我不确定如何将其结合起来。 array_give 变量不需要洗牌,array_receive 变量需要洗牌。

还有什么方法可以保证结果不会像下面这样显示?

Paul & Becky 正在给 Paul & Becky

这是我的代码。任何帮助将不胜感激。

HTML

<button type="button" id="shuffle">Create Exchange</button>
<div id="name-output"></div>

JS

$('#shuffle').on('click', function() {
        $.ajax({
            url: 'php/name-selection.php',
            type: 'POST',
            success: function(data) {
                $('#name-output').html(data);
            },
            complete:function(){

            },
            error: function(xhr, textStatus, errorThrown) {
                alert(textStatus + '|' + errorThrown);
            }
        });
    })

PHP

$array_give = array('Paul & Becky', 'Keith & Jackie', 'Dave & Lauren', 'Ashley & Jeric', 'Rob & Savannah');
$array_receive = array('Paul & Becky', 'Keith & Jackie', 'Dave & Lauren', 'Ashley & Jeric', 'Rob & Savannah');

shuffle($array_receive);

foreach( $array_receive as $receiving) {
    echo $receiving . "<br>";
}

组合成数组的函数叫做array_combine。您可以阅读它 here,并像这样使用它:

<?php
function checkSame ($a, $b) {
  foreach (array_combine($a,$b) as $key => $value)
    if ($key===$value) return true;
  return false;
}

$array_give = array('Paul & Becky', 'Keith & Jackie', 'Dave & Lauren', 'Ashley & Jeric', 'Rob & Savannah');
$array_receive = array('Paul & Becky', 'Keith & Jackie', 'Dave & Lauren', 'Ashley & Jeric', 'Rob & Savannah');

while (checkSame($array_give, $array_receive)) shuffle($array_receive);

foreach( array_combine($array_give, $array_receive) as $give => $receiving) 
{
  echo $give. " give to ".$receiving . "<br>";
}

我防止自我赠送的想法是简单地继续洗牌数组,直到没有人被分配给自己。理论上这可能 运行 永远,但我认为对于大多数实际用途来说,它会很快停止。

数组本质上是一样的,只需要一个数组。

然后您可以 pop/pick 在每次迭代中取出每个元素,这将停止自我赠送并允许检查是否有人不会收到礼物,呸骗子!

<?php
$array_give = array('Paul & Becky', 'Keith & Jackie', 'Dave & Lauren', 'Ashley & Jeric', 'Rob & Savannah');

shuffle($array_give);

$i = 0;
while ($give = array_pop($array_give)) {
    echo $give;
    if ($i % 2 != 0) {
        echo "<br>".PHP_EOL;
    } elseif (count($array_give) == 0) {
        echo ' is getting zilch! ';
        break;
    } else {
        echo ' are giving to ';
    }
    $i++;
}

.

Rob & Savannah are giving to Ashley & Jeric<br>
Dave & Lauren are giving to Keith & Jackie<br>
Paul & Becky is getting zilch! 

https://3v4l.org/KtJ47