PHP的shuffle()
不是按照我需要的方式随机化数组。我有一个二维数组,当我在它上面使用shuffle()
时,它只是随机化数组的第二维,但我需要相反的。
让我们假设这是我需要改组的数组:
Array
(
[0] => Array
(
[key1] => 199
[key2] => 6
)
[1] => Array
(
[key1] => 195
[key2] => 3
)
)
shuffle()
改变它的方式是这样的:
Array
(
[0] => Array
(
[key1] => 195
[key2] => 3
)
[1] => Array
(
[key1] => 199
[key2] => 6
)
)
但这不是我追求的。我最终需要的是:
Array
(
[1] => Array
(
[key1] => 195
[key2] => 6
)
[0] => Array
(
[key1] => 199
[key2] => 6
)
)
我知道这可以通过rand()
或mt_rand()
使用随机密钥来实现,但也可能对于少量密钥,我们可以收到相同的{{1密钥两次,导致没有一个很好的洗牌数组。
我也知道添加更多rand()
逻辑是可能的,但我希望用已实现的东西来做这件事 - 我不想重新发明轮子。
我怎样才能实现理想的洗牌?
答案 0 :(得分:3)
shuffle()
正在按计划运作。它不是“随机化第二维度”,它不是递归的。
重新排序数组的元素(恰好是数组)。您看到的问题是因为shuffle()
重置了数组的键。
来自文档(http://php.net/shuffle):
注意:此函数为数组中的元素指定新键。它将删除可能已分配的任何现有密钥,而不是 只需重新排序密钥。
为了得到你想要的东西,你需要使用array_rand()
随机化键,然后根据它重新排序数组中的元素。
$randKeys = array_rand($array, count($array));
// This is needed because array_rand was changed
// and now returns the keys in order
shuffle($randKeys);
uksort($array, function($a, $b) use($randKeys){
return array_search($a, $randKeys) - array_search($b, $randKeys);
});
答案 1 :(得分:0)
在随机播放PHP手册的评论部分,您会找到:
<?php
function shuffle_assoc(&$array) {
$keys = array_keys($array);
shuffle($keys);
foreach($keys as $key) {
$new[$key] = $array[$key];
}
$array = $new;
return true;
}
?>
答案 2 :(得分:0)
$yourArray = array(
array('key1' => 199, 'key2' => 6),
array('key1' => 195, 'key2' => 3),
array('key1' => 205, 'key2' => 8)
);
$helperArr = array();
foreach($yourArray as $subArr)
{
foreach($subArr as $key => $value)
$helperArr[$key][] = $value;
}
foreach($helperArr as &$shuffleArr)
shuffle($shuffleArr);
$shuffledArr = array();
foreach($helperArr as $key => $value)
{
for($i = 0; $i < count($value); $i++)
$shuffledArr[$i][$key] = $value[$i];
}
echo '<pre>';
print_r($helperArr);
print_r($shuffledArr);
echo '</pre>';