Réponses:
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.
array_rand_value
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.
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)];
array_rand
fonction est 1
donc inutile de l'écrire.
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;
}
array_rand
ne sont pas aussi aléatoires qu'ils devraient l'être, il mt_rand
est donc préférable
isset
partie? Cela échouerait de toute façon pour les tableaux associatifs.
mt_rand
au lieu de rand
dans ce cas, il semble préférer certains éléments plus que les autres
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 ), 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:
La array_rand
fonction 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];
mt_rand()
sont probablement mieux adaptées à la tâche.
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_rand
la 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.
$array[array_rand($array)];
?
array_flip
supprimez le double comme clé puis donnez le résultat ... Ne signifie pas de doublon!
$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) ];
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
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)];
Sur doublure:
echo $array[array_rand($array,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()
.
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
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 .
Vous obtenez un nombre aléatoire d'un tableau comme suit:
$randomValue = $rand[array_rand($rand,1)];
array_rand
n'est pas aussi aléatoire qu'il devrait l'être