2

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

我有一个数组让我们说:

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

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

现在的问题是:我想从数组中选择随机排序但基于我们拥有的键的键。我的意思是当我给出相同的键时,它总是会返回相同的顺序,但是如果我更改键,它将返回不同的有序数组。谢谢你。

4

4 回答 4

3

我的理解是您想要shuffle()数组,但要使其与$rand提供的任何值保持一致。我也相信 PHP 使用rand(在幕后)可以在shuffle其中使用srand(为提供的密钥提供一致的随机顺序)。所以,话虽如此:

$rand = 34526247;
srand($rand);
shuffle($array);

因为您总是从同一个“密钥”随机播种,所以您应该获得一致的(可重复的)洗牌结果。(至少它做了一个简短的测试

注意:这意味着$rand必须是一个数值。而且,如果在任何时候都不是,您需要将其转换为一个。

于 2013-10-04T12:45:10.703 回答
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
        )
)

编辑:包括实际排序

于 2013-10-04T13:02:01.490 回答
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 ) 
于 2013-10-04T12:42:46.677 回答
0

我可能是错的,但我读到你的意思是你问是否可以更改 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

于 2013-10-04T13:25:55.653 回答