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?

Elitmiar
quelle

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.

reko_t
quelle
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
32

PHP bietet dafür eine Funktion: array_rand ()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
NDM
quelle
3
Der Standardwert des zweiten array_randFunktionsarguments ist, 1dass Sie ihn nicht schreiben müssen.
Nabi KAZ
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;
}
Ólafur Waage
quelle
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)];
KAS
quelle
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)];
Jake
quelle
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 )
Gras Double
quelle
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];
Asciiom
quelle
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.

Smartpal
quelle
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) ];
Duroth
quelle
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));
CN Lee
quelle
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

Scott Arciszewski
quelle
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)];
Muhammad Ibnuh
quelle
2

Eine Linie: $ran[rand(0, count($ran) - 1)]

Abdelilah
quelle
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]
Rafael
quelle
2

On-Liner:

echo $array[array_rand($array,1)]
Sid
quelle
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() .

Rinogo
quelle
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

Jeff
quelle
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 .

Pankaj Kumar
quelle
-5

Sie erhalten eine Zufallszahl aus einem Array wie folgt:

$randomValue = $rand[array_rand($rand,1)];
Adam Libonatti-Roche
quelle
4
array_rand () gibt einen zufälligen Schlüssel zurück, keinen zufälligen Wert.
reko_t