Nein gebaut -in Funktion, aber Sie könnten tun dies:
function randWithout($from, $to, array $exceptions) {
sort($exceptions); // lets us use break; in the foreach reliably
$number = rand($from, $to - count($exceptions)); // or mt_rand()
foreach ($exceptions as $exception) {
if ($number >= $exception) {
$number++; // make up for the gap
} else /*if ($number < $exception)*/ {
break;
}
}
return $number;
}
Das ist ab von meinem Kopf, so könnte es Polieren verwenden - aber zumindest kann man nicht in einem Endlos-Loop-Szenario enden, auch nur hypothetisch.
Hinweis: Die Funktion bricht, wenn $exceptions
erschöpft Ihr Bereich - zum Beispiel Rufen randWithout(1, 2, array(1,2))
oder randWithout(1, 2, array(0,1,2,3))
wird nichts vernünftig ergeben (offensichtlich), aber in diesem Fall wird die zurückgegebene Nummer außerhalb der $from
- $to
reichen, so dass es leicht zu fangen ist.
Wenn $exceptions
garantiert bereits sortiert ist, kann sort($exceptions);
entfernt werden.
Augenschmaus: Somewhat minimalistic visualisation of the algorithm.
Ist Ihr 'ausgeschlossen Array' sortiert werden wahrscheinlich? Wenn das der Fall ist, können Sie den Aufruf 'asort()' in meiner Funktion entfernen, was die Dinge erheblich beschleunigen sollte. – pinkgothic
Er, 'sort()'. Entschuldige, ich habe das schon zu lange angeguckt. >.> (Aus, um frische Luft zu schnappen!) – pinkgothic
Re: "scheint, ich brauche etwas Zeit, um Ihre Lösung zu verdauen", haben Sie eine Visualisierung dessen, was mein Algorithmus tut: http://pandora.pinkgothic.com/randWithout.png (außer bitte stell dir vor, der rand (0,8) liest rand (1,8), ich spring durch hoops hier um bilder hochgeladen zu bekommen, ich war in eile XD) – pinkgothic