PHP: Zufällige Werte aus einem Array auslesen mit mt_rand

Mit der Funktion „array_rand“ hatte ich bei der Generierung eines 6-stelligen, eindeutigen Codes (aus einem Array mit ca. 30 möglichen Werten) Probleme, die Funktion hat immer ähnliche Kombinationen aus dem Array zurückgegeben. php.net schreibt dazu:

Viele Zufallszahlengeneratoren, die auf älteren libc-Versionen basieren, haben seltsame oder doch zumindest unerwartete Verhaltensweisen und sind zudem recht langsam.

Vorteil der Nutzung von „mt_rand“ ist außerdem, dass diese Funktion die Zufallszahlen ca. 4mal schneller generiert.

Deshalb hier die „array_rand“-Funktion nachgebaut mit „mt_rand“:

/**
 * Pick one or more random entries out of an array. Alternative for function "array_rand", uses the better function "mt_rand"
 *
 * @param array $input: The input array.
 * @param integer $num_req: Specifies how many entries you want to pick.
 * @return mixed: If you are picking only one entry, array_rand returns the key for a random entry. Otherwise, it returns an array of keys for the random entries. This is done so that you can pick random keys as well as values out of the array.
 */
public static function array_mt_rand($input, $num_req = 1) {
  // check parameters
  if(!is_array($input) || $num_req < 1 || count($input) < $num_req) {
    return NULL;
  }
 
  // define needed vars
  $randomKeys = array();
  $result = array();
 
  // get some random numbers
  $arraySize = count($input) - 1;
  for($i = 0; $i < $num_req; $i++) {
    do {
      $randomNumber = mt_rand(0, $arraySize);
    } while(in_array($randomNumber, $randomKeys));
    $randomKeys[] = $randomNumber;
  }
 
  // get the array keys
  $index = 0;
  foreach($input as $key => $val) {
    if(in_array($index, $randomKeys)) {
      array_push($result, $key);
    }
    $index++;
  }
  return count($result) == 1 ? array_shift($result) : $result;
}

Autor:
Geändert: Freitag, 6. November 2015 9:11 Uhr
Erstellt: Montag, 9. Mai 2011 17:04 Uhr
Tags: , , ,
Themengebiet: Web Entwicklung, PHP

Trackback: Trackback-URL LoadingZu Favoriten hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.