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、数値でなければならないことを意味します。そして、いつでもそうでない場合は、1 つに変換する必要があります。

于 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 に答える