it-swarm.com.de

Wie erhält man einen zufälligen Wert aus einem Array?

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

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

98
Roland

Sie können auch nur tun:

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

Dies ist der Weg, wenn Sie über ein assoziatives Array verfügen.

195
reko_t

PHP bietet dafür eine Funktion: array_Rand ()
http://php.net/manual/de/function.array-Rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_Rand($ran, 1)];
30
NDM

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;
}
21
Ólafur Waage
$value = $array[array_Rand($array)];
17
KAS

Sie können die Funktion array_Rand verwenden, um einen zufälligen Schlüssel aus Ihrem Array auszuwä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
Jake

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;
}

Verwendungszweck:

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

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

Ein paar Anmerkungen:

  • $amount muss kleiner oder gleich count($array) sein.
  • array_Rand() mischt die Tasten nicht (seit PHP 5.2.10, siehe 48224 ), sodass die ausgewählten Elemente immer in der ursprünglichen Reihenfolge sind. Verwenden Sie anschließend shuffle(), falls erforderlich.


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 vorhanden sind
  • array_random($array, 1) gibt ein Array eines Elements zurück ( # 19826 )
  • Unterstützungswert "0" für die Anzahl der Elemente ( # 20439 )
8
Gras Double

Die array_Rand-Funktion scheint bei großen Arrays eine ungleichmäßige Verteilung zu haben. Nicht jedes Array-Element wird wahrscheinlich gleichermaßen ausgewählt. Die Verwendung von shuffle im Array und dann das erste Element zu nehmen, hat dieses Problem nicht:

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];
7
Asciiom
$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) ];
3
Duroth

Verwenden Sie Rand (), um eine Zufallszahl für den Echo-Zufallsschlüssel zu erhalten. Im Ex: 0 - 3

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

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

Ausschnitt

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

array_Rand return key nicht wert. Also legen wir den Wert als Schlüssel um.

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

2
Smartpal

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 polyfill 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];
}

Verwendungszweck:

$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

In meinem Fall muss ich 2 Werte bekommen, 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));
1
CN Lee

Dies funktioniert gut mit Inline-Arrays. Außerdem denke ich, dass die Dinge ordentlicher und wiederverwendbarer sind, wenn sie in eine Funktion eingebunden sind.

function array_Rand_value($a) {
    return $a[array_Rand($a)];
}

Verwendungszweck:

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

In PHP <7.1.0 verwendet array_Rand()Rand(), sodass Sie diese Funktion aus Sicherheits- oder Verschlüsselungsgründen nicht verwenden möchten. Verwenden Sie diese Funktion in PHP 7.1.0+ ohne Bedenken, da Rand() AUF mt_Rand() ausgerichtet wurde.

0
rinogo

Ich halte meine Antwort von @ ÓlafurWaage ab. Ich habe versucht, es zu verwenden, stieß jedoch auf Referenzprobleme, als ich versucht hatte, das zurückgegebene Objekt zu ändern. Ich habe seine Funktion überarbeitet und per Verweis übergeben und zurückgegeben. 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/Verweise auf Objekt zurückgeben + Objekt ändern funktioniert nicht

0
Jeff

Eine Zeile: $ ran [Rand (0, Anzahl ($ ran) - 1)]

0
Abdelilah