我可以选择数组中的一些元素并在 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]]
.