Come ottenere un valore casuale da un array?


123

Ho chiamato un array $ran = array(1,2,3,4);

Devo ottenere un valore casuale da questo array e memorizzarlo in una variabile, come posso farlo?

Risposte:


232

Puoi anche fare solo:

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

Questo è il modo per farlo quando si dispone di un array associativo.


11
secondo questo commento array_rand non è così casuale come dovrebbe essere
Timo Huovinen

1
Oppure puoi richiedere questo pacchetto e utilizzarearray_rand_value
murze

10
A partire da PHP 7.1, array_rand()utilizza il generatore Mersenne Twister: rand () con alias a mt_rand () e srand () con alias a mt_srand () . In pratica ora dovrebbe essere abbastanza buono.
Gras Double


23

Puoi usare mt_rand ()

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

Questo è utile anche come funzione se hai bisogno del valore

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

4
Dovrebbe essere mt_rand (0, 3) poiché ci sono solo 4 elementi. Più correttamente però: $ array [mt_rand (0, count ($ array)]
reko_t

2
Ehm, penso che volevi dire mt_rand (0, count ($ ran) - 1)
Josh Davis,

secondo php i commenti array_randnon sono così casuali come dovrebbero essere, quindi mt_randè preferito
Timo Huovinen

1
Qual è il punto in tutta la issetparte? Questo fallirebbe comunque per gli array associativi.
Luke Cousins

Non so perché, ma quando si usa mt_randinvece di randin questo caso sembra preferire alcuni articoli più degli altri
user151496

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

14

È possibile utilizzare la funzione array_rand per selezionare una chiave casuale dall'array come di seguito.

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

oppure puoi usare le funzioni rand e count per selezionare un indice casuale.

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

11

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

Uso:

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

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

Alcune note:

  • $amountdeve essere minore o uguale a count($array).
  • array_rand()non mescola le chiavi (da PHP 5.2.10, vedi 48224 ), quindi i tuoi oggetti selezionati saranno sempre nell'ordine originale. Utilizzare in shuffle()seguito, se necessario.


Documentazione: array_rand(),shuffle()


modifica: la funzione Laravel è cresciuta notevolmente da allora, vedere Laravel 5.4'sArr::random() . Ecco qualcosa di più elaborato, derivato dalla funzione Laravel adulta:

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

Alcuni punti salienti:

  • Lancia un'eccezione se non ci sono abbastanza elementi disponibili
  • array_random($array, 1)restituisce un array di un elemento ( # 19826 )
  • Valore di supporto "0" per il numero di elementi ( # 20439 )

8

La array_randfunzione sembra avere una distribuzione non uniforme su array di grandi dimensioni, non tutti gli elementi dell'array hanno la stessa probabilità di essere selezionati. L'uso di shuffle sull'array e quindi di prendere il primo elemento non ha questo problema:

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

// Random shuffle
shuffle($myArray);

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

Tuttavia, è un sacco di "lavoro" di calcolo extra solo per ottenere un singolo elemento casuale. Le altre risposte che utilizzano mt_rand()sono probabilmente più adatte al compito.
rinogo

Dipende da quali sono le tue esigenze, suppongo. Nel mio caso, la distribuzione era molto importante e l'overhead computazionale no.
Asciiom

5

Un altro approccio attraverso il capovolgimento dell'array per ottenere un valore diretto.

Frammento

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

array_randchiave di ritorno non valore. Quindi, stiamo capovolgendo il valore come chiave.

Nota: la chiave PHP è sempre una chiave univoca, quindi quando l'array viene capovolto, il valore duplicato come chiave verrà sovrascritto.


Perché non farlo e basta $array[array_rand($array)];?
rinogo

@rinogo Funziona anche questo, questo ha già risposto sopra. Questo è leggermente diverso dalla tua risposta, array_fliprimuovi il duplicato come chiave quindi dai il risultato ... Significa nessun duplicato!
Smartpal

4
$rand = rand(1,4);

oppure, per gli array in particolare:

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

2
Non riceverai mai il primo elemento in questo elenco e usciresti dall'array con 4
Ólafur Waage

Il primo $ rand riguarda i valori. L'array originale ha valori compresi tra 1 e 4. Il secondo $ rand riguarda le chiavi dell'array, da 0 a 3.
Josh Davis,

3

Nel mio caso, devo ottenere 2 valori quali sono gli oggetti. Condivido questa semplice soluzione.

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

2

La tua selezione ha implicazioni per la sicurezza? In tal caso, utilizzare random_int()earray_keys() . ( random_bytes()è solo PHP 7, ma c'è un polyfill per PHP 5 ).

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

Uso:

$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

Usa rand () per ottenere un numero casuale da riprodurre con la chiave casuale. In es: 0-3

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


2

Avevo bisogno di una versione di riga per array corto:

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

o se l'array è fisso:

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

2

On-liner:

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

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e / o come questo codice risponde alla domanda ne migliora il valore a lungo termine.
β.εηοιτ.βε

1

Funzionerà bene con gli array in linea. Inoltre, penso che le cose siano più ordinate e più riutilizzabili se racchiuse in una funzione.

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

Uso:

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

Su PHP <7.1.0, array_rand()usa rand(), quindi non vorrai questa funzione per nulla relativo alla sicurezza o alla crittografia. Su PHP 7.1.0+, usa questa funzione senza preoccupazioni poiché rand()è stato definito un aliasmt_rand() .


0

Sto basando la mia risposta sulla funzione di @ ÓlafurWaage. Ho provato a usarlo ma stavo riscontrando problemi di riferimento quando ho provato a modificare l'oggetto di ritorno. Ho aggiornato la sua funzione per passare e tornare per riferimento. La nuova funzione è:

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

Per più contesto, vedere la mia domanda in Passaggio / restituzione di riferimenti all'oggetto + la modifica dell'oggetto non funziona


0

Un modo semplice per ottenere il valore Randdom da Array .

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

ora ogni volta otterrai colori diversi da Array .


-5

Ottieni un numero casuale da un array come segue:

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

4
array_rand () restituisce una chiave casuale, non un valore casuale.
reko_t
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.