web-dev-qa-db-fra.com

Comment extraire une valeur aléatoire d'un tableau

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

Je dois obtenir une valeur aléatoire de ce tableau et le stocker dans une variable, comment puis-je faire cela?

98
Roland

Vous pouvez aussi faire juste:

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

C'est le moyen de le faire quand vous avez un tableau associatif.

195
reko_t

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

Vous pouvez utiliser mt_Rand ()

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

Cela est pratique aussi 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;
}
21
Ólafur Waage
$value = $array[array_Rand($array)];
17
KAS

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
Jake

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:

  • $amount doit être inférieur ou égal à count($array).
  • array_Rand() ne mélange pas les clés (depuis PHP 5.2.10, voir 48224 ), vos éléments sélectionnés seront toujours dans leur ordre d'origine. Utilisez shuffle() après 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 adulte de Laravel:

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'articles disponibles
  • array_random($array, 1) renvoie un tableau d'un élément ( # 19826 )
  • Valeur d'assistance "0" pour le nombre d'éléments ( # 20439 )
8
Gras Double

La fonction array_Rand semble avoir une distribution inégale sur les tableaux de grande taille. 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];
7
Asciiom
$Rand = Rand(1,4);

ou, pour les tableaux spécifiquement:

$array = array('a value', 'another value', 'just some value', 'not some value');
$Rand = $array[ Rand(0, count($array)-1) ];
3
Duroth

Utilisez Rand () pour obtenir un nombre aléatoire qui répercute une touche aléatoire. Dans ex: 0 - 3

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

Une autre approche consiste à retourner un tableau pour obtenir une valeur directe.

Fragment

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

array_Rand clé de retour pas valeur. Nous retournons donc la valeur en tant que clé.

Remarque: La clé PHP est toujours une clé unique. Ainsi, lorsque le tableau est retourné, la valeur dupliquée en tant que clé est remplacée.

2
Smartpal

Votre sélection a-t-elle des implications en matière de 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
Scott Arciszewski

Dans mon cas, je dois obtenir 2 valeurs que 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));
1
CN Lee

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 encapsulé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(). Vous ne voudriez donc 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 Rand() A ÉTÉ ASSOCIÉ À mt_Rand() .

0
rinogo

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'ai tenté 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 à Passer/renvoyer des références à objet + changer d'objet ne fonctionne pas

0
Jeff

Une ligne: $ ran [Rand (0, compte ($ ran) - 1)]

0
Abdelilah