我的问题有点复杂,但我会尽力解释它。
我有一个数组让我们说:
$array(5){
[1]=>1,
[2]=>2,
[3]=>3,
[4]=>4,
[5]=>5
}
而且我有一个随机生成的密钥,假设密钥$rand = 34526147;的长度始终相同。
现在的问题是:我想从数组中选择随机排序但基于我们拥有的键的键。我的意思是当我给出相同的键时,它总是会返回相同的顺序,但是如果我更改键,它将返回不同的有序数组。谢谢你。
我的理解是您想要shuffle()数组,但要使其与$rand提供的任何值保持一致。我也相信 PHP 使用rand(在幕后)可以在shuffle其中使用srand(为提供的密钥提供一致的随机顺序)。所以,话虽如此:
$rand = 34526247;
srand($rand);
shuffle($array);
因为您总是从同一个“密钥”随机播种,所以您应该获得一致的(可重复的)洗牌结果。(至少它做了一个简短的测试)
注意:这意味着$rand必须是一个数值。而且,如果在任何时候都不是,您需要将其转换为一个。
除了 id 之外,您还应该为每个问题/行计算一个新值。这个值需要随着每个新键而改变,并且对你的玩家来说看起来足够随机。您可以简单地将 id 与键相乘,然后按最右边的数字排序,如下所示:
$key = 1243;
$questions = array(
195741 => array('foo'),
168762 => array('bar'),
984133 => array('baz'),
);
$newquestions = array();
foreach ($questions as $id => $row) {
// calculate a random looking order depending on $key
$newquestions[$id * $key % 100] = $row;
}
ksort($newquestions);
输出:
Array
(
[19] => Array
(
[0] => baz
)
[63] => Array
(
[0] => foo
)
[66] => Array
(
[0] => bar
)
)
编辑:包括实际排序
uksort允许根据键定义自定义排序:
uksort($array,function($a,$b){
global $rand;
return strpos(''.$rand, ''.$a) - strpos(''.$rand, ''.$b);
});
请注意,这假设所有键都存在于 $rand 中。
数组的示例状态:
Array (
[3] => 3
[4] => 4
[5] => 5
[2] => 2
[1] => 1 )
我可能是错的,但我读到你的意思是你问是否可以更改 Q 的顺序以匹配 rand int 中给出的顺序。
$questions = array(
1=>'one',
2=>'two',
3=>'three',
4=>'four',
5=>'five',
);
$rand = 34526147;
$order = array_unique(str_split($rand));
foreach($order as $ord){
if(array_key_exists($ord, $questions)) {
echo 'Q: ' . $ord . ' is ' .$questions[$ord] . PHP_EOL;
}
}
给出:
问:3是3
问:4是4
问:5 是 5
问:2是2
问:1是1