以相同的方式洗牌2个php数组

以相同的方式洗牌2个php数组,php,arrays,random,shuffle,Php,Arrays,Random,Shuffle,我举个例子: $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] =

我举个例子:

$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
是一个随机键,但在两个数组上都是相同的)。

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

希望我能正确回答您的问题

对于上面的示例,此代码应该可以工作。但是它很粗糙

$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;
变量转储($array):


像这样的东西可能有用。它与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];
}
$c=count($array['one']);
$tmp=array();

对于($i=0;$i而言,最佳实践imho如下所示:

$tmp = array_combine($array['one'],$array['two']);
shuffle($tmp);
$array['one'] = array_keys($tmp);
$array['two'] = array_values($tmp);
这是清晰的代码,应该很快。没有必要像其他答案那样重新发明轮子

$count = count($array['one']);
$order = range(1, $count);

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

这不是多维数组的示例,但它非常适用于以相同的方式对多个普通数组进行排序,并使用无序排列。可能它也适用于多维数组。它确实假设所有数组的长度相同

$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];
}
$array\u count=count($array\u 1);

对于($i=0;$i,$i)第二个数组值总是两位数吗?不,它们实际上是字符串,我举了一个例子。为了得到最佳答案,您可能需要包含您想要的确切结果。我希望$array['one'][0]和$array['two'][0]被洗牌,以得到$array['one'][x]和$array['two'][x](x是一个随机键,但在两个数组上都是相同的)。这不适用于
$array['one']
中的重复值或非字符串/整数值。这不起作用。参数的顺序错误-array\u multisort(array1,排序顺序,排序类型,array2,array3…)。此外,排序顺序参数值不能是数组。一个非常旧的答案仍然有效+1@DanteCullari这工作正常。请检入解释器。它工作正常是因为排序顺序和标志是可选的。使用array\u multisort,您可以对任何数组计数进行排序。在这里,您可以对三个数组进行排序。只需按照第一个“shufled”进行排序即可这里的顺序只是名称,是带有无序索引的数组,而不是文档中描述的“排序”。
$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];
}