Yanıtlar:
Ayrıca şunları da yapabilirsiniz:
$k = array_rand($array);
$v = $array[$k];
İlişkilendirilebilir bir diziniz olduğunda bunu yapmanın yolu budur.
array_rand()
Mersenne Twister oluşturucusunu kullanır . Pratikte artık yeterince iyi olmalı.
PHP tam da bunun için bir işlev sağlar: 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
İşlevin ikinci bağımsız değişkeninin varsayılan değeri , 1
bu nedenle onu yazmaya gerek yoktur.
Mt_rand () kullanabilirsiniz
$random = $ran[mt_rand(0, count($ran) - 1)];
Değere ihtiyacınız varsa, bu bir işlev olarak da kullanışlıdır
function random_value($array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
return isset($array[$k])? $array[$k]: $default;
}
array_rand
olması gerektiği kadar rastgele değil, bu yüzden mt_rand
tercih edilir
isset
bölümün anlamı ne ? Bu, ilişkilendirilebilir diziler için yine de başarısız olur.
mt_rand
yerine kullanırken rand
bazı öğeleri diğerlerinden daha çok tercih ediyor gibi görünüyor
Aşağıdaki gibi dizinizden rastgele bir anahtar seçmek için array_rand işlevini kullanabilirsiniz.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];
veya rasgele bir dizin seçmek için rand ve count işlevlerini kullanabilirsiniz.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
Laravel'den türetilmiştir 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;
}
Kullanımı:
$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];
array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']
Birkaç not:
$amount
küçük veya eşit olmalıdır count($array)
.array_rand()
anahtarları karıştırmaz (PHP 5.2.10'dan beri, 48224'e bakın ), böylece seçtiğiniz öğeler her zaman orijinal sırada olacaktır. Gerekirse shuffle()
daha sonra kullanın .
Belgeler: array_rand()
,shuffle()
düzenleme: Laravel işlevi o zamandan beri gözle görülür şekilde büyüdü, Laravel 5.4'e bakın Arr::random()
. İşte yetişkin Laravel işlevinden türetilen daha ayrıntılı bir şey:
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;
}
Birkaç önemli nokta:
array_rand
Fonksiyon, her dizi öğesi eşit olasılıkla seçilmiş olsun etmektir geniş dizilişi üzerinde dengesiz bir dağılıma sahip görünmektedir. kullanmaDizi üzerinde shuffle ve sonra ilk elemanı almak bu sorunu yaratmaz:
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
mt_rand()
muhtemelen göreve daha uygundur.
Doğrudan değer elde etmek için diziyi çevirme yoluyla başka bir yaklaşım.
Pasaj
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
dönüş anahtarı değer değil. Yani, değeri anahtar olarak değiştiriyoruz.
Not: PHP anahtarı her zaman benzersiz bir anahtar olacaktır, bu nedenle dizi ters çevrildiğinde, anahtar olarak yinelenen değerin üzerine yazılacaktır.
$array[array_rand($array)];
?
array_flip
yinelenenleri anahtar olarak kaldırın ve sonuç verin ... Yani yinelenen değil!
$rand = rand(1,4);
veya diziler için özellikle:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Seçiminizin herhangi bir güvenlik etkisi var mı? Eğer öyleyse, random_int()
ve kullanın array_keys()
. ( random_bytes()
yalnızca PHP 7'dir, ancak PHP 5 için bir çoklu dolgu vardır ).
function random_index(array $source)
{
$max = count($source) - 1;
$r = random_int(0, $max);
$k = array_keys($source);
return $k[$r];
}
Kullanımı:
$array = [
'apple' => 1234,
'boy' => 2345,
'cat' => 3456,
'dog' => 4567,
'echo' => 5678,
'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);
Demo: https://3v4l.org/1joB1
Rastgele anahtarı yankılamak için rastgele sayı elde etmek için rand () kullanın. Örn: 0-3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
On-astar:
echo $array[array_rand($array,1)]
Bu, sıralı dizilerle güzelce çalışacaktır. Ayrıca, bir işleve sarıldığında her şeyin daha düzenli ve yeniden kullanılabilir olduğunu düşünüyorum.
function array_rand_value($a) {
return $a[array_rand($a)];
}
Kullanımı:
array_rand_value(array("a", "b", "c", "d"));
PHP Açık <7.1.0, array_rand()
kullanır rand()
, böylece güvenlik veya kriptografi ile ilgili herhangi bir şey için bu işlev istemem. PHP 7.1.0+ üzerinde, rand()
takma adımt_rand()
verildiği için bu işlevi endişe duymadan kullanın .
Cevabımı @ ÓlafurWaage işlevine dayandırıyorum. Kullanmayı denedim, ancak dönüş nesnesini değiştirmeye çalıştığımda referans sorunlarıyla karşılaşıyordum. Referansla geçmek ve geri dönmek için işlevini güncelledim. Yeni işlev:
function &random_value(&$array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
if (isset($array[$k])) {
return $array[$k];
} else {
return $default;
}
}
Daha fazla bağlam için, Nesneye Gönderme / Döndürme referansları + değişen nesne çalışmıyor sayfasındaki soruma bakın
Randdom değerini Array'den almanın basit bir yolu .
$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)
şimdi her seferinde Array'den farklı renkler alacaksınız .
Aşağıdaki gibi bir diziden rastgele bir sayı elde edersiniz:
$randomValue = $rand[array_rand($rand,1)];
array_rand
olması gerektiği kadar rastgele değil