3

配列内のいくつかの要素を選択して、PHPでシャッフルできますか?あなたが使用するとき、あなたは知っています

shuffle(array) 

、配列内のすべての要素をシャッフルしますが、他の要素を変更せずに配列内の一部の要素をシャッフルしたいのですが、どうすればよいですか?

4

2 に答える 2

2

次のことを考慮してください

function swap(&$a, &$b) { list($a, $b) = array($b, $a); }

$len = count($a);
for($i = 0; $i < $len; $i++) {
   $j = rand(1, $len) - 1;
   swap($a[$i], $a[$j]);
}

これは、すべての配列要素をシャッフルする標準ループです。一部の (「移動可能な」) 要素のみをシャッフルするには、それらのキーを配列に入れましょう

$keys = array(1, 3, 5, 7, 9, 11, 13, 17);

$a のループを $keys のループに置き換えます

$len = count($keys);
for($i = 0; $i < $len; $i++) {
   $j = rand(1, $len) - 1;
   swap($a[$keys[$i]], $a[$keys[$j]]);
}

これにより、要素が位置 1、3、5 などに移動し、他の要素はそのまま残ります。

于 2009-11-21T15:29:26.230 に答える
1

を使用array_sliceして、シャッフルする配列の部分をコピーし、コピーをシャッフルしてからarray_splice、シャッフルされたデータを元の配列にコピーして戻すことができます。

編集:より一般的には、シャッフルしたいアイテムのキーがわかっている場合は、それらを という配列に入れます$keys。それで:

// Get out the items to shuffle.
$work = array();
foreach ($keys as $i => $key) {
    $work[$i] = $myarray[$key];
}

shuffle($work);  // shuffle them

// And put them back.
foreach ($keys as $i => $key) {
    $myarray[$key] = $work[$i];
}

(これに間違いがあれば申し訳ありません。私の PHP は錆びていて、テストできるコンピューターの近くにありません!)

非常によく似たものが多次元配列でも機能します。の各要素は$keysインデックスの配列である可能性があり、代わりに$myarray[$key]を記述し$myarray[$key[0]][$key[1]]ます。

于 2009-11-21T14:51:17.823 に答える