我的问题有点复杂,但我会尽力解释它。
我有一个数组让我们说:
$array(5){
[1]=>1,
[2]=>2,
[3]=>3,
[4]=>4,
[5]=>5
}
我有一个随机生成的密钥,假设$rand = 34526147;
密钥的长度始终相同。
现在的问题是:我想从数组中选择随机排序的键,但这是基于我们所拥有的键。我的意思是当我提供相同的密钥时,它将始终返回相同的顺序,但如果我更改密钥,它将返回不同的有序数组。谢谢。
答案 0 :(得分:3)
我的理解是你想要shuffle()
数组,但要使它与提供的$rand
值保持一致。我也相信PHP在rand
中使用shuffle
(幕后),这使得srand
成为可能(为所提供的密钥提供一致的随机顺序)。所以,随着说:
$rand = 34526247;
srand($rand);
shuffle($array);
因为你总是从同一个“钥匙”中随机播种,你应该得到一致的(可重复的)洗牌结果。 (至少它使用brief test)
注意:这意味着$rand
必须是数值。并且,如果在任何时候它不是,你需要将其转换为一个。
答案 1 :(得分:1)
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 )
答案 2 :(得分:1)
除了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
)
)
编辑:包括实际排序
答案 3 :(得分:0)
我可能错了,但我读到你的意思是你要问你是否可以改变Qs的顺序以匹配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是三
问:4是4
问:5是五
问:2是两个
问:1是一个