Wie bekomme ich einen zufälligen Wert aus einem Array?


123

Ich habe ein Array namens $ran = array(1,2,3,4);

Ich muss einen zufälligen Wert aus diesem Array herausholen und in einer Variablen speichern. Wie kann ich das tun?

Antworten:


232

Sie können auch nur Folgendes tun:

$k = array_rand($array);
$v = $array[$k];

Dies ist der Weg, wenn Sie ein assoziatives Array haben.


11
nach diesem Kommentar array_rand ist nicht so zufällig wie es sein sollte
Timo Huovinen

1
Oder Sie können dieses Paket benötigen und verwendenarray_rand_value
murze

10
array_rand()Verwendet seit PHP 7.1 den Mersenne Twister-Generator: rand () aliased auf mt_rand () und srand () aliased auf mt_srand () . In der Praxis sollte es jetzt gut genug sein.
Gras Double


23

Sie können mt_rand () verwenden

$random = $ran[mt_rand(0, count($ran) - 1)];

Dies ist auch als Funktion nützlich, wenn Sie den Wert benötigen

function random_value($array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    return isset($array[$k])? $array[$k]: $default;
}

4
Sollte mt_rand (0, 3) sein, da es nur 4 Elemente gibt. Richtiger jedoch: $ array [mt_rand (0, count ($ array)]
reko_t

2
Ähm, ich denke du meintest mt_rand (0, count ($ ran) - 1)
Josh Davis

Laut PHP-Kommentaren array_randist es nicht so zufällig, wie es sein sollte, also mt_randwird es bevorzugt
Timo Huovinen

1
Was ist der Sinn im ganzen issetTeil? Dies würde für assoziative Arrays sowieso fehlschlagen.
Luke Cousins

Ich weiß nicht warum, aber bei der Verwendung mt_randanstelle von randin diesem Fall scheint einige Elemente mehr als die anderen zu bevorzugen
user151496

20
$value = $array[array_rand($array)];

14

Mit der Funktion array_rand können Sie einen zufälligen Schlüssel aus Ihrem Array auswählen (siehe unten).

$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];

Oder Sie können die Rand- und Count-Funktionen verwenden, um einen zufälligen Index auszuwählen.

$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];

11

Abgeleitet von Laravel Collection::random():

function array_random($array, $amount = 1)
{
    $keys = array_rand($array, $amount);

    if ($amount == 1) {
        return $array[$keys];
    }

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

Verwendung:

$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];

array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']

Ein paar Anmerkungen:

  • $amountmuss kleiner oder gleich sein count($array).
  • array_rand()mischt keine Schlüssel (seit PHP 5.2.10, siehe 48224 ), sodass Ihre ausgewählten Artikel immer in der ursprünglichen Reihenfolge sind. Verwenden Sie shuffle()danach , wenn nötig.


Dokumentation : array_rand(),shuffle()


edit: Die Laravel-Funktion ist seitdem merklich gewachsen, siehe Laravel 5.4 Arr::random(). Hier ist etwas Ausführlicheres, abgeleitet von der erwachsenen Laravel-Funktion:

function array_random($array, $number = null)
{
    $requested = ($number === null) ? 1 : $number;
    $count = count($array);

    if ($requested > $count) {
        throw new \RangeException(
            "You requested {$requested} items, but there are only {$count} items available."
        );
    }

    if ($number === null) {
        return $array[array_rand($array)];
    }

    if ((int) $number === 0) {
        return [];
    }

    $keys = (array) array_rand($array, $number);

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

Einige Highlights:

  • Ausnahme auslösen, wenn nicht genügend Elemente verfügbar sind
  • array_random($array, 1)gibt ein Array mit einem Element zurück ( # 19826 )
  • Unterstützungswert "0" für die Anzahl der Elemente ( # 20439 )

8

Die array_randFunktion scheint auf großen Arrays ungleichmäßig verteilt zu sein, nicht jedes Array-Element wird gleich wahrscheinlich ausgewählt. Das Verwenden von Shuffle für das Array und das anschließende Aufnehmen des ersten Elements hat kein Problem:

$myArray = array(1, 2, 3, 4, 5);

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];

Das ist jedoch eine Menge zusätzlicher rechnerischer "Arbeit", nur um ein einzelnes zufälliges Element zu erhalten. Die anderen Antworten, die verwendet mt_rand()werden , sind wahrscheinlich besser für die Aufgabe geeignet.
Rinogo

Kommt darauf an, was du brauchst, nehme ich an. In meinem Fall war die Verteilung sehr wichtig und der Rechenaufwand nicht.
Asciiom

5

Ein weiterer Ansatz durch Umdrehen des Arrays, um einen direkten Wert zu erhalten.

Snippet

$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));

array_randRückgabeschlüssel nicht Wert. Wir drehen also den Wert als Schlüssel um.

Hinweis: Der PHP-Schlüssel ist immer ein eindeutiger Schlüssel. Wenn das Array umgedreht wird, wird der doppelte Wert als Schlüssel überschrieben.


Warum nicht einfach tun $array[array_rand($array)];?
Rinogo

@rinogo Es funktioniert auch. Dies wurde bereits oben beantwortet. Dies unterscheidet sich ein wenig von Ihrer Antwort. array_flipEntfernen Sie das Duplikat als Schlüssel und geben Sie das Ergebnis an.
Smartpal

4
$rand = rand(1,4);

oder speziell für Arrays:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];

2
Sie würden nie das erste Element in dieser Liste bekommen und Sie würden mit 4
Ólafur Waage

Der erste $ rand handelt von Werten. Das ursprüngliche Array hat Werte im Bereich von 1 bis 4. Der zweite $ rand handelt von Array-Schlüsseln, 0 bis 3.
Josh Davis

3

In meinem Fall muss ich 2 Werte erhalten, was Objekte sind. Ich teile diese einfache Lösung.

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));

2

Hat Ihre Auswahl Auswirkungen auf die Sicherheit? Wenn ja, verwenden Sie random_int()und array_keys(). ( random_bytes()ist nur PHP 7, aber es gibt eine Polyfüllung für PHP 5 ).

function random_index(array $source)
{
    $max = count($source) - 1;
    $r = random_int(0, $max);
    $k = array_keys($source);
    return $k[$r];
}

Verwendung:

$array = [
    'apple' =>   1234,
    'boy'   =>   2345,
    'cat'   =>   3456,
    'dog'   =>   4567,
    'echo'  =>   5678,
    'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);

Demo: https://3v4l.org/1joB1


2

Verwenden Sie rand (), um eine Zufallszahl für das Echo des Zufallsschlüssels zu erhalten. In Beispiel: 0 - 3

$ran = array(1,2,3,4);
echo $ran[rand(0,3)];


2

Ich brauchte eine einzeilige Version für ein kurzes Array:

($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]

oder wenn das Array fest ist:

[1, 2, 3, 4][mt_rand(0, 3]

2

On-Liner:

echo $array[array_rand($array,1)]

Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
β.εηοιτ.βε

1

Dies funktioniert gut mit Inline-Arrays. Außerdem denke ich, dass die Dinge aufgeräumter und wiederverwendbarer sind, wenn sie in eine Funktion eingepackt werden.

function array_rand_value($a) {
    return $a[array_rand($a)];
}

Verwendung:

array_rand_value(array("a", "b", "c", "d"));

Unter PHP <7.1.0 wird array_rand()verwendet rand(), sodass Sie diese Funktion nicht für Sicherheits- oder Kryptografiezwecke verwenden möchten. Verwenden Sie diese Funktion unter PHP 7.1.0+ ohne Bedenken, da rand()ein Alias ​​fürmt_rand() .


0

Ich stütze meine Antwort auf die Funktion von @ ÓlafurWaage. Ich habe versucht, es zu verwenden, aber es gab Referenzprobleme, als ich versucht hatte, das Rückgabeobjekt zu ändern. Ich habe seine Funktion aktualisiert, um sie als Referenz zu übergeben und zurückzugeben. Die neue Funktion ist:

function &random_value(&$array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    if (isset($array[$k])) {
        return $array[$k];
    } else {
        return $default;
    }
}

Weitere Informationen finden Sie in meiner Frage unter Übergeben / Zurückgeben von Verweisen auf Objekt + Objektwechsel funktioniert nicht


0

Ein einfacher Weg, um den Zufallswert aus dem Array zu erhalten .

$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)

Jetzt erhalten Sie jedes Mal andere Farben von Array .


-5

Sie erhalten eine Zufallszahl aus einem Array wie folgt:

$randomValue = $rand[array_rand($rand,1)];

4
array_rand () gibt einen zufälligen Schlüssel zurück, keinen zufälligen Wert.
reko_t
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.