【问题标题】:How to combine two arrays in a php shuffle如何在 php shuffle 中组合两个数组
【发布时间】:2017-11-24 20:02:08
【问题描述】:

我正在尝试创建一个随机播放功能来配对人们交换礼物。我创建了它的基本外壳,但不确定从这里去哪里。我正在获取输出以对数据进行洗牌,但是我想将 array_givearray_receive 变量结合起来,以便输出以下内容:

Paul 和 Becky 将捐赠给 Keith 和 Jackie。

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

还有没有办法确保结果不显示如下?

保罗和贝基正在给保罗和贝基

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

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>";
}

【问题讨论】:

    标签: php shuffle


    【解决方案1】:

    由于数组本质上是一样的,所以你只需要一个数组。

    然后您可以在每次迭代中弹出/挑选每个元素,这将停止自我赠送并允许检查某人不会收到礼物,呸!

    <?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

    【讨论】:

      【解决方案2】:

      合并到数组的函数称为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>";
      }
      

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

      【讨论】:

      • 谢谢!我正在查看 array_combine 函数,但无法弄清楚。你知道我是否可以用各种计时器一个一个地显示每个结果?
      • 一个简单的sleep(5);(5 秒)后每个回显应该这样做。
      • 我刚试过你的推荐。它在 25 秒后不显示结果(所有结果都运行),然后在每个结果之后显示 0。
      • 奇怪。 0 可能意味着 sleep 失败并返回 false。但我不知道为什么它会被打印出来。也许您可以尝试使用更大的数字睡眠。
      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 2011-05-21
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多