8

我有这个例如:

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

4

6 回答 6

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

shuffle($order);
array_multisort($order, $array['one'], $array['two']);
  • 适用于具有任何类型元素的数组(对象和数组也是如此)。
  • 这种方式可以与任意数量的数组(不仅仅是两个)一起使用。
  • 适用于重复值。
  • 干净的代码。
于 2012-01-30T21:35:18.537 回答
3

像这样的东西可以工作。它与 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];
}
于 2011-02-06T16:08:59.447 回答
0

希望我能让你正确。

对于上面的示例,此代码应该可以工作。但这很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"
  }
}
于 2011-02-06T11:02:18.450 回答
0

恕我直言,最佳实践如下:

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

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

于 2011-02-06T17:47:57.707 回答
0

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

$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];
}

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

于 2014-05-14T18:05:22.137 回答
-1

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

于 2011-02-06T05:43:35.377 回答