Bir diziden rastgele değer nasıl elde edilir?


124

Adında bir dizim var $ran = array(1,2,3,4);

Bu diziden rastgele bir değer almam ve onu bir değişkene kaydetmem gerekiyor, bunu nasıl yapabilirim?

Yanıtlar:


232

Ayrıca şunları da yapabilirsiniz:

$k = array_rand($array);
$v = $array[$k];

İlişkilendirilebilir bir diziniz olduğunda bunu yapmanın yolu budur.


11
bu yoruma göre array_randolması gerektiği kadar rastgele değil
Timo Huovinen

1
Ya da bu paketiarray_rand_value
isteyip

10
PHP 7.1'den beri, mt_rand () için diğer ad olan rand () ve mt_srand () için diğer ad olan srand ()array_rand() Mersenne Twister oluşturucusunu kullanır . Pratikte artık yeterince iyi olmalı.
Gras Double


23

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;
}

4
Yalnızca 4 öğe olduğundan mt_rand (0, 3) olmalıdır. Daha doğrusu: $ array [mt_rand (0, count ($ array)]
reko_t

2
Err, sanırım mt_rand (0, count ($ run) - 1)
Josh Davis

php yorumlarına göre array_randolması gerektiği kadar rastgele değil, bu yüzden mt_randtercih edilir
Timo Huovinen

1
Bütün issetbölümün anlamı ne ? Bu, ilişkilendirilebilir diziler için yine de başarısız olur.
Luke Cousins

nedenini bilmiyorum ama bu durumda mt_randyerine kullanırken randbazı öğeleri diğerlerinden daha çok tercih ediyor gibi görünüyor
user151496

20
$value = $array[array_rand($array)];

14

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)];

11

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:

  • $amountküçü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:

  • Yeterli öğe yoksa istisna atın
  • array_random($array, 1)bir öğeden oluşan bir dizi döndürür ( # 19826 )
  • Öğe sayısı için destek değeri "0" ( # 20439 )

8

array_randFonksiyon, 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];

Bu, yalnızca tek bir rastgele öğe elde etmek için çok fazla ekstra hesaplama "çalışması" demek. Kullanılan diğer cevaplar mt_rand()muhtemelen göreve daha uygundur.
rinogo

İhtiyaçlarınızın ne olduğuna bağlı sanırım. Benim durumumda, dağıtım çok önemliydi ve hesaplama ek yükü değildi.
Asciiom

5

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_randdö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.


Neden sadece yapmıyorsun $array[array_rand($array)];?
rinogo

@rinogo da çalışıyor, Bu zaten yukarıda cevaplandı. Bu, cevabınızdan biraz farklıdır, array_flipyinelenenleri anahtar olarak kaldırın ve sonuç verin ... Yani yinelenen değil!
Smartpal

4
$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) ];

2
Bu listedeki ilk öğeyi asla alamazsınız ve dizinin dışına 4
lafur Waage

İlk $ rand, değerlerle ilgilidir. Orijinal dizi 1 ile 4 arasında değişen değerlere sahiptir. İkinci $ rand, 0 ile 3 arasındaki dizi anahtarları hakkındadır.
Josh Davis

3

Benim durumumda, nesneler olan 2 değer almam gerekiyor. Bu basit çözümü paylaşıyorum.

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));

2

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


2

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)];


2

Kısa dizi için tek satırlık versiyona ihtiyacım vardı:

($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]

veya dizi sabitse:

[1, 2, 3, 4][mt_rand(0, 3]

2

On-astar:

echo $array[array_rand($array,1)]

Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır.
β.εηοιτ.βε

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 .


0

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


0

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 .


-5

Aşağıdaki gibi bir diziden rastgele bir sayı elde edersiniz:

$randomValue = $rand[array_rand($rand,1)];

4
array_rand (), rastgele bir değer değil, rastgele bir anahtar döndürür.
reko_t
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.