Risposte:
Puoi anche fare solo:
$k = array_rand($array);
$v = $array[$k];
Questo è il modo per farlo quando si dispone di un array associativo.
array_rand_value
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.
PHP fornisce una funzione proprio per questo: array_rand ()
http://php.net/manual/en/function.array-rand.php
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
array_rand
funzione è 1
quindi non è necessario scriverlo.
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;
}
array_rand
non sono così casuali come dovrebbero essere, quindi mt_rand
è preferito
isset
parte? Questo fallirebbe comunque per gli array associativi.
mt_rand
invece di rand
in questo caso sembra preferire alcuni articoli più degli altri
È 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)];
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:
$amount
deve 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:
La array_rand
funzione 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];
mt_rand()
sono probabilmente più adatte al compito.
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_rand
chiave 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.
$array[array_rand($array)];
?
array_flip
rimuovi il duplicato come chiave quindi dai il risultato ... Significa nessun duplicato!
$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) ];
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
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)];
On-liner:
echo $array[array_rand($array,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()
.
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
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 .
Ottieni un numero casuale da un array come segue:
$randomValue = $rand[array_rand($rand,1)];
array_rand
non è così casuale come dovrebbe essere