PHP Array shuffle,保持独特

时间:2012-03-04 16:53:08

标签: php

这是我的第一个php脚本和问题,iv除了循环功能“太多延迟”之外没有任何结论。但它没有解决我的问题,我从未研究过编程,或者是什么,所以我希望有一个受过教育的人来填补我这个:

我有一个包含120个元素的数组;由重复项组成,例如:

myArray = [0]= item_1, [1] = item _1, [2] = item_2, [3] = item_3 ect..

简单地说我试图制作一个flash php pokermachine但是我需要将数组中的这些项目改组但是我不希望重复之后在重复之后彼此相邻但是我需要重复仍然在数组

我不能做一个循环功能来检查这个因为它会改变洗牌太多次会影响游戏的几率:下面就是我现在所拥有的:

/ *删除了此处不再可用的链接* /

您可能会注意到它会在同一个卷轴中加倍使用2个项目 基本上我用php.ini文件动态创建虚拟卷轴 这些值被重复推入一个数组($ virtualreel),因此该值可能在卷轴中出现10次,另一个值将出现5次变化的几率。然后我从$ virtualreel中取一个随机切片()来显示3个变量从这个卷轴和其他卷轴重复循环4次,我也只能随机播放一次,因为我希望slice()来自相同的卷轴数组顺序

如果我在一个切片上加倍(数组,3个项目),我只会将每个没有运行循环函数的新旋转洗牌,然后进行随机播放。

希望iv解释了什么我很好,以便给你们一个想法。

2 个答案:

答案 0 :(得分:1)

您可以使用此功能:

<?php

function shuffleArray($myArray) {
  $value_count = array_count_values($myArray);
  foreach($value_count as $key=>$value) {
      if ($value > count($myArray)/2) {
           return false;
      }
  }
  $last_value = $myArray[count($myArray) - 1];
  unset($myArray[count($myArray) - 1]);
  $shuffle = array();
  $last = false;
  while (count($myArray) > 0) {
    $keys = array_keys($myArray);
    $i = round(rand(0, count($keys) - 1));
    while ($last === $myArray[$keys[$i]]) {
        $i = round(rand(0, count($keys) - 1));
    }
    $shuffle[] = $myArray[$keys[$i]];
    $last = $myArray[$keys[$i]];
    unset($myArray[$keys[$i]]);
  }

  if ($last_value === $last) {
    $i = 0;
    foreach($shuffle as $key=>$value) {
        if ($value !== $last_value) {
            $i = $key;
            break;
        }
    }
    array_splice($shuffle, $i + 1, 0, $last_value);
  } else {
    $shuffle[] = $last_value;
  }

  return $shuffle;
}

print_r(shuffleArray(array(1,5,5,3,7,7)));

答案 1 :(得分:1)

为什么不呢:

编辑:

$shuffled = array();
while(count($to_shuffle) > 0):
    $i = rand(0, count($to_shuffle)-1);
    $shuffled[] = $to_shuffle[$i];
    array_splice($to_shuffle, $i, 1,null);                  
endwhile;

我认为这是您所期望的,如果您不介意不保留键和值之间的关联。