1

ある範囲の番号を人に割り当てる必要があるシステムを実装していますが、以前に使用した番号は使用していません。
番号範囲と除外リストの両方が非常に大きくなることに注意してください。

最初は、次のようなことをするのが最善だと思いました。

<?php 
  $start = 1;
  $end = 199999;
  $excluded = array(4,6,7,8,9,34);
  $found = FALSE;
  while (!$found) {
    $rand = mt_rand($start,$end);
    if (!in_array($rand,$excluded)) {
      $found = TRUE;
    }
  } 
?>

しかし、これは理想的ではないと思います。無限ループが発生する可能性があります(または、非常に長い時間/スクリプトのタイムアウトが発生する可能性があります)。

必要なすべての数の配列を生成することも考えましたが、確かに大規模な配列の方が悪いでしょうか?また、2つの大規模な配列で配列差分を実行すると、確かに長い時間がかかりますか?このようなもの:

<?php 
  $start = 1;
  $end = 199999;
  $allnums = range($start,$end);
  $excluded = array(4,6,7,8,9,34);
  $searcharray = array_diff($allnums,$excluded);
  $rand = array_rand($searcharray);
?>

だから、私の質問はどちらがより良いオプションでしょうか?そして、誰かが以前に使用したことのある、これを行う別の(より良い)方法はありますか?

4

1 に答える 1

2

アレイが大量のデータを保持すると、大量のメモリを消費します。データベースを使用してこれらの数値を保持することはできませんか?それは一般的に彼らが設計されているものです。

于 2012-04-30T15:22:50.033 に答える