If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:
<?php array_rand(array_flip($array), $n); ?>array_rand
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
array_rand
Референца за `function.array-rand.php` со подобрена типографија и навигација.
array_rand
(PHP 4, PHP 5, PHP 7, PHP 8)
array_rand — Изберете една или повеќе случајни клучеви од низа
= NULL
Избира една или повеќе случајни записи од низа и ги враќа клучевите (или клучевите) на случајните записи.
Оваа функција не генерира криптографски сигурни вредности, и Ако завршниот идентификатор е вовлечен, може да се користат и табулатори, но табулаторите и празнините да се користи за криптографски цели, или цели што бараат вратените вредности да бидат непредвидливи.
Ако е потребна криптографски сигурна случајност, Random\Randomizer може да се користи со Random\Engine\Secure engine. За едноставни случаи на употреба, random_int() and random_bytes() функциите обезбедуваат удобен и сигурен API што е поддржано од оперативниот систем CSPRNG.
Оваа функција ја користи глобалната Mt19937 („Mersenne Twister“) инстанца како извор на случајност и на тој начин ја споделува својата состојба со сите други функции што ја користат глобалната Mt19937. Користењето на која било од овие функции ја напредува секвенцата за all другите функции, без оглед на опсегот.
Генерирање повторливи секвенци со поставување семе mt_srand() or srand() со позната вредност, исто така, ќе даде повторлив излез од оваа функција.
Претпочитајте да користите Random\Randomizer методи во целиот новонапишан код.
Параметри
array-
Влезниот низ. Не може да биде празен.
num-
Определува колку записи треба да се изберат. Мора да биде поголемо од нула и помало или еднакво на должината на
array
Вратени вредности
Кога се избира само еден запис, array_rand() враќа клуч за случаен запис. Во спротивно, се враќа низа од клучеви за случајните записи. Ова се прави за да може да се изберат случајни клучеви од низата, како и случајни вредности. Ако се вратат повеќе клучеви, тие ќе бидат вратени во редоследот по кој биле присутни во оригиналниот низ.
Errors/Exceptions
Фрла ValueError if array е празен, или ако num е надвор од опсег.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 |
array_rand() сега фрла ValueError
if num е надвор од опсег; претходно
E_WARNING и функцијата врати null.
|
| 8.0.0 |
array_rand() сега фрла ValueError
if array е празно; претходно
E_WARNING и функцијата врати null.
|
| 7.1.0 | Внатрешниот алгоритам за рандомизација е променет за да се користи » Мерсен Твистер Генератор случајних бројева уместо libc rand функције. |
Примери
Пример #1 array_rand() example
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>Види Исто така
- Random\Randomizer::pickArrayKeys() - Изберете случајни клучеви од низа
- Random\Randomizer::shuffleBytes() - Добијте пермутацију низа
Белешки од корисници 6 белешки
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.<?php
/**
* Wraps array_rand call with additional checks
*
* TLDR; not so radom as you'd wish.
*
* NOTICE: the closer you get to the input arrays length, for the n parameter, the output gets less random.
* e.g.: array_random($a, count($a)) == $a will yield true
* This, most certainly, has to do with the method used for making the array random (see other comments).
*
* @throws OutOfBoundsException – if n less than one or exceeds size of input array
*
* @param array $array – array to randomize
* @param int $n – how many elements to return
* @return array
*/
function array_random(array $array, int $n = 1): array
{
if ($n < 1 || $n > count($array)) {
throw new OutOfBoundsException();
}
return ($n !== 1)
? array_values(array_intersect_key($array, array_flip(array_rand($array, $n))))
: array($array[array_rand($array)]);
}<?php
// An example how to fetch multiple values from array_rand
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;
// If you want to fetch multiple values you can try this:
print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );
// If you want to re-index keys wrap the call in 'array_values':
print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );array_rand () takes a random value without ever being able to go back in its choice of random value.
A simple example:
I decide to mix an array of 10 entries to retrieve 3 values. This choice will give increasing and random values.
$myarray = range(1,10);
$pm = array_rand($myarray,3);
// $pm return array(0->0,1->6,2->8)
But if I decide to shuffle an array of 10 entries to get 10 entries, array_rand () will choose to assign a value to each return value and therefore the return array will not be random.
$gm = array_rand($myarray,count($myarray));
// $gm not random array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)
The easiest way to have a truly random value:
either use array_rand () in a loop of 1 value at a time
$deg = range(-60,60);
$size = range(16,64);
$color = ["blue","red","green","pink","orange","purple","grey","darkgreen","darkkhaki"];
$i = 0;
$longueur = 10;
do{
++$i;
printf("<span style='transform: rotateZ(%ddeg); display: inline-block;font-size: %spx; color:%s'>%s</span>",
$deg[array_rand($deg)],
$size[array_rand($size)],
$color[array_rand($color)],
$alnum[array_rand($alnum)]);
}while($i < $longueur);
------------------
or simply use shuffle () to shuffle the array really randomly.for a cryptographically secure version, try
<?php
/**
* fetch a random key from array, using a cryptograpically secure rng
* discussed+reviewed at https://codereview.stackexchange.com/questions/275832/cryptographically-secure-version-of-the-core-array-rand-function/
*
* @param array $array
* @throws ValueError if array is empty
* @return int|string key
*/
function array_rand_cryptographically_secure(array $array)/*: int|string*/ {
$max = count ( $array ) - 1;
if ($max < 0) {
throw new ValueError ( 'Argument #1 ($array) cannot be empty' );
}
return key ( array_slice ( $array, random_int ( 0, $max ), 1, true ) );
}
$tests = [
[5, 6, 7],
['a' => 1, 'b' => 2, 'c' => 3],
['zero', 4 => 'four', 9 => 'nine'],
["PEAN"=>0],
[]
];
foreach ($tests as $test) {
echo array_rand_cryptographically_secure($test) . "\n";
}
?>
(this is an improved version, which unlike the first version, avoids copying *all* the keys)