Odpowiedzi:
Możesz też po prostu:
$k = array_rand($array);
$v = $array[$k];
To jest sposób na zrobienie tego, gdy masz tablicę asocjacyjną.
array_rand_value
array_rand()
używa generatora Mersenne Twister: rand () z aliasem do mt_rand () i srand () z aliasem do mt_srand () . W praktyce powinno być teraz wystarczająco dobre.
PHP udostępnia funkcję właśnie do tego: 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
funkcji jest 1
taka, więc nie trzeba jej pisać.
Możesz użyć mt_rand ()
$random = $ran[mt_rand(0, count($ran) - 1)];
Przydaje się to również jako funkcja, jeśli potrzebujesz wartości
function random_value($array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
return isset($array[$k])? $array[$k]: $default;
}
array_rand
nie jest tak losowy, jak powinien, więc mt_rand
jest preferowany
isset
części? To i tak nie powiedzie się dla tablic asocjacyjnych.
mt_rand
zamiast rand
w tym przypadku wydaje się, że wolę niektóre elementy bardziej niż inne
Możesz użyć funkcji array_rand, aby wybrać losowy klucz z tablicy, jak poniżej.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];
lub możesz użyć funkcji rand i count, aby wybrać losowy indeks.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
Pochodzi z 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;
}
Stosowanie:
$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];
array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']
Kilka uwag:
$amount
musi być mniejsze lub równe count($array)
.array_rand()
nie tasuje kluczy (od PHP 5.2.10, zobacz 48224 ), więc wybrane elementy zawsze będą w oryginalnej kolejności. W shuffle()
razie potrzeby użyj później.
Dokumentacja: array_rand()
,shuffle()
edycja: Funkcja Laravel znacznie się rozwinęła od tego czasu, zobacz Laravel 5.4 Arr::random()
. Oto coś bardziej wyszukanego, wywodzącego się z funkcji Laravela dla dorosłych:
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;
}
Kilka najważniejszych informacji:
array_rand
Funkcja wydaje się mieć nierówną dystrybucję na dużych tablicach, nie każdy element tablicy jest równie prawdopodobne, aby odebrał. Użycie shuffle na tablicy, a następnie pobranie pierwszego elementu nie ma tego problemu:
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
mt_rand()
prawdopodobnie lepiej pasują do tego zadania.
Inne podejście polegające na odwracaniu tablicy w celu uzyskania bezpośredniej wartości.
Skrawek
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
zwracany klucz, a nie wartość. Więc odwracamy wartość jako klucz.
Uwaga: klucz PHP zawsze jest kluczem unikalnym, więc po odwróceniu tablicy zduplikowana wartość klucza zostanie nadpisana.
$array[array_rand($array)];
?
array_flip
usuń duplikat jako klucz, a następnie podaj wynik ... Oznacza brak duplikatów!
$rand = rand(1,4);
lub, w szczególności dla tablic:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Czy Twój wybór ma wpływ na bezpieczeństwo? Jeśli tak, użyj random_int()
i array_keys()
. ( random_bytes()
jest tylko PHP 7, ale istnieje polifill dla PHP 5 ).
function random_index(array $source)
{
$max = count($source) - 1;
$r = random_int(0, $max);
$k = array_keys($source);
return $k[$r];
}
Stosowanie:
$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
Użyj rand (), aby uzyskać losową liczbę i echo losowego klucza. Na przykład: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
On-line:
echo $array[array_rand($array,1)]
Będzie to dobrze działać z tablicami wbudowanymi. Poza tym myślę, że rzeczy są bardziej uporządkowane i nadają się do wielokrotnego użytku, gdy są opakowane w funkcję.
function array_rand_value($a) {
return $a[array_rand($a)];
}
Stosowanie:
array_rand_value(array("a", "b", "c", "d"));
W PHP <7.1.0 array_rand()
używa rand()
, więc nie chciałbyś używać tej funkcji do niczego związanego z bezpieczeństwem lub kryptografią. W PHP 7.1.0+, użyj tej funkcji bez obaw, ponieważ rand()
została utworzona aliasmt_rand()
.
Opieram swoją odpowiedź na funkcji @ ÓlafurWaage. Próbowałem go użyć, ale napotkałem problemy z odwołaniami, gdy próbowałem zmodyfikować zwracany obiekt. Zaktualizowałem jego funkcję, aby przekazywała i wracała przez odniesienie. Nowa funkcja to:
function &random_value(&$array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
if (isset($array[$k])) {
return $array[$k];
} else {
return $default;
}
}
Aby uzyskać więcej kontekstu, zobacz moje pytanie w Przekazywanie / zwracanie odniesień do obiektu + zmiana obiektu nie działa
Prosty sposób na uzyskanie wartości Randdom z tablicy .
$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)
teraz za każdym razem otrzymasz różne kolory z Array .
Otrzymujesz losową liczbę z tablicy w następujący sposób:
$randomValue = $rand[array_rand($rand,1)];
array_rand
nie jest tak przypadkowy, jak powinien