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?

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.


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


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

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)];

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)];

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 )

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

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.


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) ];

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

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


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)];


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]

2

Sur doublure:

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

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() .


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


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 .


-5

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

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

4
array_rand () renvoie une clé aléatoire, pas une valeur aléatoire.
reko_t
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.