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 回答