【问题标题】:Shuffle 2 php arrays in the same way以相同的方式随机播放 2 个 php 数组
【发布时间】:2025-12-21 21:05:06
【问题描述】:

我有这个例子:

$array['one'][0] = 0;
$array['one'][1] = 1;
$array['one'][2] = 2;
$array['one'][3] = 3;

$array['two'][0] = 00;
$array['two'][1] = 11;
$array['two'][2] = 22;
$array['two'][3] = 33;

我怎样才能将它们都洗牌以获得类似的东西:

$array['one'][0] = 2;
$array['one'][1] = 1;
$array['one'][2] = 3;
$array['one'][3] = 0;

$array['two'][0] = 22;
$array['two'][1] = 11;
$array['two'][2] = 33;
$array['two'][3] = 00;

或任何其他随机顺序,但两者具有相同的“随机因子”?

例如,我希望将 $array['one'][0]$array['two'][0] 打乱以得到 $array['one'][x]$array['two'][x]x 是随机键,但两个数组上的键相同)。

【问题讨论】:

  • 第二个数组值总是是两位数吗?
  • 不,它们实际上是字符串,我将其作为示例发布。
  • 您可能希望包含您所追求的确切结果,以获得最佳答案。
  • 我希望 $array['one'][0] 和 $array['two'][0] 得到洗牌以获得 $array['one'][x] 和 $array[ 'two'][x](x 是随机键,但两个数组上的键相同)。

标签: php arrays random shuffle


【解决方案1】:
$count = count($array['one']);
$order = range(1, $count);

shuffle($order);
array_multisort($order, $array['one'], $array['two']);
  • 适用于具有任何类型元素的数组(对象和数组也是如此)。
  • 这种方式可以用于任意数量的数组(不仅仅是两个)。
  • 适用于重复值。
  • 干净的代码。

【讨论】:

  • 这不起作用。参数的顺序错误 - array_multisort(array1,sorting order,sorting type,array2,array3...)。排序顺序参数值也不能是数组。 php.net/manual/en/function.array-multisort.php
  • 一个非常古老的答案,仍然在踢 +1
  • @DanteCullari 这工作正常。检查口译员。它之所以有效,是因为排序顺序和标志是可选的。使用 array_multisort 您可以对任何数组计数进行排序。在这里,您对三个数组进行排序。只是按照第一个“shuffled”数组的排序。这里的订单只是名称 - 是带有随机索引的数组 - 不是文档中描述的“排序”。
【解决方案2】:

这样的事情可能会奏效。它类似于 Mimikry 的答案,除了这个即使你碰巧在数组 1 中有重复值也可以工作(这个不使用数组 1 的值作为临时数组的键)。

假设两个数组大小相同。

$c = count($array['one']);
$tmp = array();
for ($i=0; $i<$c; $i++) {
  $tmp[$i] = array($array['one'][$i], $array['two'][$i]);
}
shuffle($tmp);
for ($i=0; $i<$c; $i++) {
  $array['one'][$i] = $tmp[$i][0];
  $array['two'][$i] = $tmp[$i][1];
}

【讨论】:

    【解决方案3】:

    希望我能理解你。

    对于上面的示例,此代码应该可以工作。但这很 hacky...

    $array['one'][0] = 'A';
    $array['one'][1] = 'B';
    $array['one'][2] = 'C';
    $array['one'][3] = 'D';
    
    $array['two'][0] = 'AA';
    $array['two'][1] = 'BB';
    $array['two'][2] = 'CC';
    $array['two'][3] = 'DD';
    
    // save the dependencies in tmp array
    foreach ($array['two'] as $key => $val) {
        $tmp[$array['one'][$key]] = $val;
    }
    
    shuffle($array['one']);
    
    // restore dependencies in tmp2 array
    foreach ($array['one'] as $key => $val) {
        $tmp2[$key] = $tmp[$val];
    }
    
    // overwrite with restore array
    $array['two'] = $tmp2;
    

    var_dump($array):

    array(2) {
      ["one"]=>
      array(4) {
        [0]=>
        string(1) "B"
        [1]=>
        string(1) "A"
        [2]=>
        string(1) "C"
        [3]=>
        string(1) "D"
      }
      ["two"]=>
      array(4) {
        [0]=>
        string(2) "BB"
        [1]=>
        string(2) "AA"
        [2]=>
        string(2) "CC"
        [3]=>
        string(2) "DD"
      }
    }
    

    【讨论】:

      【解决方案4】:

      恕我直言,最佳做法如下:

      $tmp = array_combine($array['one'],$array['two']);
      shuffle($tmp);
      $array['one'] = array_keys($tmp);
      $array['two'] = array_values($tmp);
      

      这是清晰的代码,应该很快。无需像其他答案那样重新发明*。

      【讨论】:

      • 这不适用于$array['one'] 中的重复值或非字符串/整数值。
      【解决方案5】:

      这不是多维数组的示例,但它非常适合以相同的方式和随机排序多个普通数组。也许它也可以适用于多维数组。它确实假设所有数组的长度相同。

      $array_count = count($array_1);
      
      for($i=0;$i<=($array_count-1);$i++){
          $temp_array[$i] = $i;
      }
      
      shuffle($temp_array);
      
      for($i=0;$i<=($array_count-1);$i++){
          $o = $temp_array[$i];
          $array_1_sorted[$i]=$array_1[$o];
          $array_2_sorted[$i]=$array_2[$o];
          $array_3_sorted[$i]=$array_3[$o];
      }
      

      这将为您提供所有以相同随机方式排序的新数组。然后,您可以将旧数组设置为等于新数组或保持它们完好无损。

      【讨论】:

        【解决方案6】:

        不确定您到底要做什么,但最好的选择可能是将数组 1 和数组 2 放入一个多维数组,然后随机主数组。这将为您提供随机排列的值,但在每个键中将是每个数组的值。如果您能提供更多关于您正在做什么的详细信息,我们可以为您提供更具体的答案。

        【讨论】:

          最近更新 更多