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?
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.
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)];
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;
}
$value = $array[array_Rand($array)];
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)];
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:
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];
$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) ];
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)];
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.
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
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));
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()
.
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
Une ligne: $ ran [Rand (0, compte ($ ran) - 1)]