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]and $array['two'][0]get shuffled to get $array['one'][x]and $array['two'][x](xランダムキーですが、両方の配列で同じです)。

4

6 に答える 6

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

ベストプラクティスは次のとおりです。

$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 に答える
0

うまくいけば、私はあなたを正しく理解します。

上記の例では、このコードが機能するはずです。しかし、それはかなりハックです...

$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(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 に答える
-1

何をしようとしているのか正確にはわかりませんが、おそらく最善の策は、配列 1 と配列 2 を多次元配列に入れてから、プライマリ配列をランダムにすることです。これにより、値がランダムに配置されますが、各キー内には各配列の値が含まれます。あなたが何をしているのかをもう少し詳しく教えていただければ、より具体的な回答を提供できます。

于 2011-02-06T05:43:35.377 に答える