PHP 8.5.0 Beta 3 available for testing

array_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

array_rand — Bir diziden belli sayıda rasgele anahtar döndĂŒrĂŒr

Açıklama

array_rand(array $dizi, int $istek_sayısı = 1): int|string|array

array_rand() ißlevi bir diziden belli sayıda rasgele eleman seçer ve bunların anahtarlarını döndĂŒrĂŒr.

Dikkat

Bu ißlev kriptografik olarak gĂŒvenilir değerler ĂŒretmez ve kriptografik amaçlarla veya döndĂŒrĂŒlen değerlerin tahmin edilemez olmasını gerektiren amaçlarla kullanılmamalıdır.

Kriptografik olarak gĂŒvenilir rastgelelik gerekliyse Random\Randomizer sınıfı Random\Engine\Secure motoru ile kullanılabilir. Basit kullanım durumlarında random_int() ve random_bytes() ißlevleri, ißletim sisteminin CSPRNG’i tarafından desteklenen kullanıßlı ve gĂŒvenli bir arayĂŒz sağlar.

Bağımsız Değißkenler

dizi

İßleme sokulacak dizi. Boß olamaz.

istek_sayısı

Kaç tane rasgele eleman döndĂŒrĂŒleceği belirtilir. Sıfırdan bĂŒyĂŒk ve dizi uzunluğundan kĂŒĂ§ĂŒk veya ona eßit olmalıdır.

Dönen Değerler

Sadece bir girdi alınmak istenirse array_rand() ißlevi diziden rasgele bir anahtarla döner. Aksi takdirde, rasgele elemanların anahtarlarını içeren bir dizi döndĂŒrĂŒr. Böylece, diziden rasgele anahtarlar değerleriyle birlikte bir dizi olarak çekilmiß olur. Birden fazla anahtar döndĂŒrĂŒlĂŒyorsa, bunlar dizideki yerlerine uygun sırada çekilir.

Hatalar/İstisnalar

dizi boßsa veya istek_sayısı aralık dıßındaysa bir ValueError olußur.

SĂŒrĂŒm Bilgisi

SĂŒrĂŒm: Açıklama
8.0.0 istek_sayısı aralık dıßındaysa artık bir ValueError olußuyor. Evvelce bir E_WARNING yayımlanır ve ißlev null döndĂŒrĂŒrdĂŒ.
8.0.0 dizi boßsa artık bir ValueError olußuyor. Evvelce bir E_WARNING yayımlanır ve ißlev null döndĂŒrĂŒrdĂŒ.
7.1.10 Dahili rasgelelik algoritması değißtirildi. Libc rand ißlevi yerine artık » Mersenne Twister Rasgele Sayı Üreteci kullanılıyor.
4.2.0Rasgele sayı ĂŒreteci otomatik tohumlanır.

Örnekler

Örnek 1 - array_rand() örneği

<?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";
?>

Ayrıca Bakınız

add a note

User Contributed Notes 6 notes

up
94
Anonymous ¶
15 years ago
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); ?>
up
79
Anonymous ¶
13 years ago
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
up
21
grzeniufication ¶
7 years ago
<?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)]);
}
up
12
grzeniufication ¶
7 years ago
<?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 ) ) ) ) );
up
0
fulachan2 at gmail dot com ¶
3 years ago
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.
up
-2
divinity76+spam at gmail dot com ¶
3 years ago
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)
To Top