使用随机密钥从数组中进行选择

时间:2013-10-04 12:35:02

标签: php arrays random

我的问题有点复杂,但我会尽力解释它。

我有一个数组让我们说:

$array(5){
      [1]=>1,
      [2]=>2,
      [3]=>3,
      [4]=>4,
      [5]=>5
   }

我有一个随机生成的密钥,假设$rand = 34526147;密钥的长度始终相同。

现在的问题是:我想从数组中选择随机排序的键,但这是基于我们所拥有的键。我的意思是当我提供相同的密钥时,它将始终返回相同的顺序,但如果我更改密钥,它将返回不同的有序数组。谢谢。

4 个答案:

答案 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是一个