- zgulde / php_random_array_element.md
- Получить случайные элементы из массива в PHP
- 1. Использование array_rand() функция
- 2. Использование mt_rand() функция
- array_rand
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Смотрите также
- User Contributed Notes 7 notes
- PHP array_rand() Function
- Syntax
- Parameter Values
- Technical Details
- More Examples
- Example
- Example
- COLOR PICKER
- Report Error
- Thank You For Helping Us!
zgulde / php_random_array_element.md
Figuring out how to get a random array element will give a better understanding of how PHP works, as well as how arrays work in general.
Lets start with this code:
And get a random number out of it!
First we need a random index out of the array.
Remember that arrays are 0 — indexed, and the largest index is one less than the number of items in the array.
Using our $numbers array as an example:
$numbers = [1, 2, 3, 4, 5]; // ^ ^ ^ ^ ^ // indexes | | | | | // 0 1 2 3 4
- The first element, 1 is at index 0 , and the last element, 5 is at index 4
- The total number of elements in the array is 5
- 4, the greatest index in the array, is one less than 5, the total number of elements in the array.
Keeping this in mind, lets get a random index from our $numbers array. We’ll use PHP’s build-in count function that returns the number of items in an array.
$randomIndex = mt_rand(0, count($numbers) - 1);
Luckily, PHP has a built-in function to do all this thinking for us, array_rand . All we have to do is give array_rand an array, and it will return us a random index in it. We could rewrite our code like so.
$randomIndex = array_rand($numbers);
Now we need to access the element at our random index.
$randomNumber = $numbers[$randomIndex];
And we have a random number from our array!
Lets pull this code out into a separate function that we can reuse.
function getRandomArrayElement($array) < $randomIndex = array_rand($array); $randomElement = $array[$randomIndex]; return $randomElement; >
Now to get a random number from our $numbers array, all we would have to do is call our function.
$randomNumber = getRandomArrayElement($numbers);
We could also rewrite our function to be a one liner:
function getRandomArrayElement($array) < return $array[array_rand($array)]; >
Получить случайные элементы из массива в PHP
В этом посте мы обсудим, как генерировать случайные записи из массива в PHP.
1. Использование array_rand() функция
Простым и эффективным решением является использование array_rand() функция для выбора одной или нескольких случайных записей из массива. Вот программа PHP для выбора случайного ключа из массива $arr :
The array_rand() Функция возвращает ключ случайной записи. Чтобы выбрать случайное значение (не ключ) случайной записи, используйте приведенный ниже фрагмент кода:
Вот пример использования замыкания.
Второй аргумент array_rand() Функция указывает, сколько случайных записей должно быть выбрано. Вот программа PHP для выбора $n случайные значения из массива $arr :
Видеть Руководство по PHP Больше подробностей.
2. Использование mt_rand() функция
До PHP 7.1.0 внутренний алгоритм рандомизации для array_rand() использует функцию libc rand, которая работает медленнее и менее случайна, чем генератор чисел Mersenne Twister. Если ваши ключи массива являются числовыми, вот лучшая альтернатива для выбора случайного значения из массива $arr :
The mt_rand() функция является лучшей альтернативой для старых rand() . Однако оба array_rand() а также mt_rand() не генерирует криптографически безопасные значения. В криптографических целях рассмотрите возможность использования random_int() , random_bytes() , или же openssl_random_pseudo_bytes() вместо.
Ссылаться на Руководство по PHP Больше подробностей.
Это все о генерации случайных записей из массива в PHP.
Средний рейтинг 4.92 /5. Подсчет голосов: 12
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
array_rand
Выбирает одно или несколько случайных значений из массива. Возвращает ключ (или ключи) данных случайных элементов.
Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.
Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure . Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.
Список параметров
Определяет количество выбираемых элементов.
Возвращаемые значения
Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям. Это сделано для того, чтобы дать возможность выбрать из массива как случайные значения, так и случайные ключи. Если возвращается несколько ключей, они будут возвращены в том порядке, в котором они присутствовали в исходном массиве. Попытка выбрать больше элементов, чем есть в массиве, сгенерирует ошибку уровня E_WARNING и вернёт NULL.
Список изменений
Версия | Описание |
---|---|
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна. |
Примеры
Пример #1 Пример использования array_rand()
$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» ;
?>?php
Смотрите также
User Contributed Notes 7 notes
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:
It doesn’t explicitly say it in the documentation, but PHP won’t pick the same key twice in one call.
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.
$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
——————
or simply use shuffle () to shuffle the array really randomly.
/**
* 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 )]);
>
// An example how to fetch multiple values from array_rand
$a = [ ‘a’ , ‘b’ , ‘c’ , ‘d’ , ‘e’ , ‘f’ , ‘g’ ];
$n = 3 ;
?php
// 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 ) ) ) ) );
for a cryptographically secure version, try
/**
* 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)
Generate random index in weights array.
Implementation of Vose’s Alias Method.
class AliasMethod
protected $count ;
protected $prob ;
protected $alias ;
public function __construct ( $weight )
$count = count ( $weight );
$sum = array_sum ( $weight );
$d = $count / $sum ;
$small = [];
$large = [];
while (!empty( $small ) AND !empty( $large )) $l = array_pop ( $small );
$g = array_pop ( $large );
$prob [ $l ] = $weight [ $l ];
$alias [ $l ] = $g ;
if ( ( $weight [ $g ] += $weight [ $l ] — 1 ) < 1 )
$small [] = $g ;
else
$large [] = $g ;
>
foreach ( $large as $i )
$prob [ $i ] = 1 ;
foreach ( $small as $i )
$prob [ $i ] = 1 ;
$this -> prob = $prob ;
$this -> alias = $alias ;
$this -> count = $count ;
public function next (): int
$i = mt_rand ( 0 , $this -> count — 1 );
if ( mt_rand () / mt_getrandmax () prob [ $i ])
return $i ;
else
return $this -> alias [ $i ];
>
>
$weight = [ 1 , 2 , 1 , 1 , 100 , 1 , 1 , 5 , 1 , 1 ];
$rnd = new AliasMethod ( $weight );
$results = array_fill ( 0 , count ( $weight ), 0 );
for( $i = 0 ; $i < 100000 ; ++ $i ) $results [ $rnd -> next ()]++;
>
print_r ( $results );
- Функции для работы с массивами
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_fill
- array_filter
- array_flip
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_intersect
- array_is_list
- array_key_exists
- array_key_first
- array_key_last
- array_keys
- array_map
- array_merge_recursive
- array_merge
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_replace_recursive
- array_replace
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff_assoc
- array_udiff_uassoc
- array_udiff
- array_uintersect_assoc
- array_uintersect_uassoc
- array_uintersect
- array_unique
- array_unshift
- array_values
- array_walk_recursive
- array_walk
- array
- arsort
- asort
- compact
- count
- current
- end
- extract
- in_array
- key_exists
- key
- krsort
- ksort
- list
- natcasesort
- natsort
- next
- pos
- prev
- range
- reset
- rsort
- shuffle
- sizeof
- sort
- uasort
- uksort
- usort
- each
PHP array_rand() Function
The array_rand() function returns a random key from an array, or it returns an array of random keys if you specify that the function should return more than one key.
Syntax
Parameter Values
Parameter Description array Required. Specifies an array number Optional. Specifies how many random keys to return Technical Details
Return Value: Returns a random key from an array, or an array of random keys if you specify that the function should return more than one key PHP Version: 4+ PHP Changelog: PHP 7.1: rand() uses the Mersenne Twister random number generator
PHP 5.2.1: The resulting array of keys is no longer shuffled
PHP 4.2: The random number generator is seeded automaticallyMore Examples
Example
Return a random key from an array:
Example
Return an array of random string keys:
COLOR PICKER
Report Error
If you want to report an error, or if you want to make a suggestion, do not hesitate to send us an e-mail:
Thank You For Helping Us!
Your message has been sent to W3Schools.
Top Tutorials
Top References
Top Examples
Get Certified
W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.