配列内のいくつかの要素を選択して、PHPでシャッフルできますか?あなたが使用するとき、あなたは知っています
shuffle(array)
、配列内のすべての要素をシャッフルしますが、他の要素を変更せずに配列内の一部の要素をシャッフルしたいのですが、どうすればよいですか?
次のことを考慮してください
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 などに移動し、他の要素はそのまま残ります。
を使用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]]
ます。