Comment obtenir une valeur aléatoire d'un tableau?

123

J'ai un tableau appelé $ran = array(1,2,3,4);

J'ai besoin d'obtenir une valeur aléatoire de ce tableau et de la stocker dans une variable, comment puis-je faire cela?

Elitmiar
la source

Réponses:

232

Vous pouvez également faire simplement:

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

C'est la manière de le faire lorsque vous avez un tableau associatif.

reko_t
la source
11
selon ce commentaire array_rand n'est pas aussi aléatoire qu'il devrait l'être
Timo Huovinen
1
Ou vous pouvez avoir besoin de ce package et utiliserarray_rand_value
murze
10
Depuis PHP 7.1, array_rand()utilise le générateur Mersenne Twister: rand () alias mt_rand () et srand () alias mt_srand () . En pratique, cela devrait maintenant être assez bon.
Gras Double
32

PHP fournit une fonction juste pour cela: array_rand ()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
NDM
la source
3
La valeur par défaut du deuxième argument de la array_randfonction est 1donc inutile de l'écrire.
Nabi KAZ
23

Vous pouvez utiliser mt_rand ()

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

Cela est également utile en tant que fonction si vous avez besoin de la valeur

function random_value($array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    return isset($array[$k])? $array[$k]: $default;
}
Ólafur Waage
la source
4
Devrait être mt_rand (0, 3) car il n'y a que 4 éléments. Plus correctement cependant: $ array [mt_rand (0, count ($ array)]
reko_t
2
Euh, je pense que vous vouliez dire mt_rand (0, count ($ ran) - 1)
Josh Davis
selon php, les commentaires array_randne sont pas aussi aléatoires qu'ils devraient l'être, il mt_randest donc préférable
Timo Huovinen
1
Quel est le point dans toute la issetpartie? Cela échouerait de toute façon pour les tableaux associatifs.
Luke Cousins
je ne sais pas pourquoi, mais lors de l'utilisation mt_randau lieu de randdans ce cas, il semble préférer certains éléments plus que les autres
user151496
20
$value = $array[array_rand($array)];
KAS
la source
14

Vous pouvez utiliser la fonction array_rand pour sélectionner une clé aléatoire dans votre tableau comme ci-dessous.

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

ou vous pouvez utiliser les fonctions rand et count pour sélectionner un index aléatoire.

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

Dérivé de 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;
}

Usage:

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

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

Quelques notes:

  • $amountdoit être inférieur ou égal à count($array).
  • array_rand()ne mélange pas les clés (depuis PHP 5.2.10, voir 48224 ), donc vos éléments choisis seront toujours dans l'ordre d'origine. Utilisez shuffle()ensuite si nécessaire.


Documentation: array_rand(),shuffle()


edit: La fonction Laravel a sensiblement augmenté depuis lors, voir Laravel 5.4's Arr::random(). Voici quelque chose de plus élaboré, dérivé de la fonction Laravel adulte:

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

Quelques points forts:

  • Lancer une exception s'il n'y a pas assez d'éléments disponibles
  • array_random($array, 1)renvoie un tableau d'un élément ( # 19826 )
  • Prise en charge de la valeur "0" pour le nombre d'éléments ( # 20439 )
Gras Double
la source
8

La array_randfonction semble avoir une distribution inégale sur les grands tableaux, tous les éléments du tableau ne sont pas également susceptibles d'être sélectionnés. Utiliser shuffle sur le tableau puis prendre le premier élément ne pose pas ce problème:

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];
Asciiom
la source
Cela représente beaucoup de "travail" de calcul supplémentaire juste pour obtenir un seul élément aléatoire. Les autres réponses qui utilisent mt_rand()sont probablement mieux adaptées à la tâche.
rinogo
Cela dépend de vos besoins, je suppose. Dans mon cas, la distribution était très importante et la surcharge de calcul ne l'était pas.
Asciiom
5

Une autre approche par retournement de tableau pour obtenir une valeur directe.

Fragment

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

array_randla clé de retour n'est pas la valeur. Donc, nous inversons la valeur comme clé.

Remarque: la clé PHP est toujours une clé unique, donc lorsque le tableau est retourné, la valeur dupliquée en tant que clé sera écrasée.

Smartpal
la source
Pourquoi ne pas le faire $array[array_rand($array)];?
rinogo
@rinogo Cela fonctionne aussi, cela a déjà répondu ci-dessus. C'est un peu différent de votre réponse, array_flipsupprimez le double comme clé puis donnez le résultat ... Ne signifie pas de doublon!
Smartpal
4
$rand = rand(1,4);

ou, pour les tableaux en particulier:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Duroth
la source
2
Vous n'obtiendrez jamais le premier élément de cette liste et vous sortiriez du tableau avec 4
Ólafur Waage
Le premier $ rand concerne les valeurs. Le tableau d'origine a des valeurs allant de 1 à 4. Le deuxième $ rand concerne les clés de tableau, de 0 à 3.
Josh Davis
3

Dans mon cas, je dois obtenir 2 valeurs qui sont des objets. Je partage cette solution simple.

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

Votre sélection a-t-elle des implications sur la sécurité? Si tel est le cas, utilisez random_int()et array_keys(). ( random_bytes()est PHP 7 uniquement, mais il existe un polyfill pour PHP 5 ).

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

Usage:

$array = [
    'apple' =>   1234,
    'boy'   =>   2345,
    'cat'   =>   3456,
    'dog'   =>   4567,
    'echo'  =>   5678,
    'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);

Démo: https://3v4l.org/1joB1

Scott Arciszewski
la source
2

Utilisez rand () pour obtenir un nombre aléatoire pour faire écho à la clé aléatoire. En ex: 0 - 3

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

Une ligne: $ran[rand(0, count($ran) - 1)]

Abdelilah
la source
2

J'avais besoin d'une version en ligne pour un tableau court:

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

ou si le tableau est fixe:

[1, 2, 3, 4][mt_rand(0, 3]
Rafael
la source
2

Sur doublure:

echo $array[array_rand($array,1)]
Sid
la source
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
β.εηοιτ.βε
1

Cela fonctionnera bien avec les tableaux en ligne. De plus, je pense que les choses sont plus ordonnées et plus réutilisables lorsqu'elles sont enveloppées dans une fonction.

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

Usage:

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

Sur PHP <7.1.0, array_rand()utilise rand(), donc vous ne voudriez pas utiliser cette fonction pour tout ce qui concerne la sécurité ou la cryptographie. Sur PHP 7.1.0+, utilisez cette fonction sans souci car elle rand()a reçu un aliasmt_rand() .

rinogo
la source
0

Je fonde ma réponse sur la fonction de @ ÓlafurWaage. J'ai essayé de l'utiliser mais je rencontrais des problèmes de référence lorsque j'avais essayé de modifier l'objet de retour. J'ai mis à jour sa fonction pour passer et revenir par référence. La nouvelle fonction est:

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

Pour plus de contexte, voir ma question sur Passer / Renvoyer des références à l'objet + changer d'objet ne fonctionne pas

Jeff
la source
0

Un moyen simple d'obtenir une valeur Randdom sous forme d'Array .

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

maintenant, à chaque fois, vous obtiendrez des couleurs différentes de Array .

Pankaj Kumar
la source
-5

Vous obtenez un nombre aléatoire d'un tableau comme suit:

$randomValue = $rand[array_rand($rand,1)];
Adam Libonatti-Roche
la source
4
array_rand () renvoie une clé aléatoire, pas une valeur aléatoire.
reko_t