Jak uzyskać losową wartość z tablicy?

124

Mam tablicę o nazwie $ran = array(1,2,3,4);

Muszę pobrać losową wartość z tej tablicy i zapisać ją w zmiennej, jak mogę to zrobić?

Elitmiar
źródło

Odpowiedzi:

232

Możesz też po prostu:

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

To jest sposób na zrobienie tego, gdy masz tablicę asocjacyjną.

reko_t
źródło
11
według tego komentarza array_rand nie jest tak przypadkowy, jak powinien
Timo Huovinen
1
Lub możesz zażądać tego pakietu i korzystaćarray_rand_value
murze
10
Od PHP 7.1 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.
Gras Double
32

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)];
NDM
źródło
3
Domyślna wartość drugiego argumentu array_randfunkcji jest 1taka, więc nie trzeba jej pisać.
Nabi KAZ
23

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;
}
Ólafur Waage
źródło
4
Powinien być mt_rand (0, 3), ponieważ są tylko 4 elementy. Jednak bardziej poprawnie: $ array [mt_rand (0, count ($ array)]
reko_t
2
Eee, myślę, że miałeś na myśli mt_rand (0, count ($ ran) - 1)
Josh Davis,
według komentarzy php array_randnie jest tak losowy, jak powinien, więc mt_randjest preferowany
Timo Huovinen
1
Jaki jest sens w całej tej issetczęści? To i tak nie powiedzie się dla tablic asocjacyjnych.
Luke Cousins
nie wiem dlaczego, ale kiedy używam mt_randzamiast randw tym przypadku wydaje się, że wolę niektóre elementy bardziej niż inne
user151496
20
$value = $array[array_rand($array)];
KAS
źródło
14

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)];
Jake
źródło
11

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:

  • $amountmusi 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:

  • Wyrzuć wyjątek, jeśli nie ma wystarczającej liczby dostępnych przedmiotów
  • array_random($array, 1)zwraca tablicę jednego elementu ( # 19826 )
  • Wartość wsparcia „0” dla liczby elementów ( # 20439 )
Gras Double
źródło
8

array_randFunkcja 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];
Asciiom
źródło
To jednak dużo dodatkowej „pracy” obliczeniowej, aby uzyskać pojedynczy element losowy. Inne odpowiedzi, których używamy, mt_rand()prawdopodobnie lepiej pasują do tego zadania.
rinogo
Przypuszczam, że zależy od twoich potrzeb. W moim przypadku dystrybucja była bardzo ważna, a narzut obliczeniowy nie.
Asciiom
5

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_randzwracany 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.

Smartpal
źródło
Dlaczego po prostu nie zrobić $array[array_rand($array)];?
rinogo
@rinogo To też działa, to już odpowiedział powyżej. To trochę różni się od twojej odpowiedzi, array_flipusuń duplikat jako klucz, a następnie podaj wynik ... Oznacza brak duplikatów!
Smartpal
4
$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) ];
Duroth
źródło
2
Nigdy nie dostaniesz pierwszej pozycji na tej liście i wyjdziesz poza tablicę z 4
Ólafur Waage
Pierwszy $ rand dotyczy wartości. Oryginalna tablica ma wartości z zakresu od 1 do 4. Drugi $ rand dotyczy kluczy tablicy, od 0 do 3.
Josh Davis
3

W moim przypadku muszę uzyskać 2 wartości, które są obiektami. Podzielam to proste rozwiązanie.

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));
CN Lee
źródło
2

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

Scott Arciszewski
źródło
2

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)];
Muhammad Ibnuh
źródło
2

Jedna linia: $ran[rand(0, count($ran) - 1)]

Abdelilah
źródło
2

Potrzebowałem wersji z jedną linią dla krótkiej tablicy:

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

lub jeśli tablica jest naprawiona:

[1, 2, 3, 4][mt_rand(0, 3]
Rafael
źródło
2

On-line:

echo $array[array_rand($array,1)]
Sid
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
β.εηοιτ.βε
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() .

rinogo
źródło
0

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

Jeff
źródło
0

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 .

pankaj kumar
źródło
-5

Otrzymujesz losową liczbę z tablicy w następujący sposób:

$randomValue = $rand[array_rand($rand,1)];
Adam Libonatti-Roche
źródło
4
array_rand () zwraca losowy klucz, a nie losową wartość.
reko_t