Bagaimana cara mendapatkan nilai acak dari sebuah array?

123

Saya memiliki array yang disebut $ran = array(1,2,3,4);

Saya perlu mendapatkan nilai acak dari larik ini dan menyimpannya dalam variabel, bagaimana saya bisa melakukan ini?

Elitmiar
sumber

Jawaban:

32

PHP menyediakan fungsi hanya untuk itu: array_rand ()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
NDM
sumber
3
Nilai default dari argumen array_randfungsi kedua 1jadi tidak perlu menulisnya.
Nabi KAZ
23

Anda dapat menggunakan mt_rand ()

$random = $ran[mt_rand(0, count($ran) - 1)];

Ini berguna sebagai fungsi juga jika Anda membutuhkan nilainya

function random_value($array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    return isset($array[$k])? $array[$k]: $default;
}
Ólafur Waage
sumber
4
Harus mt_rand (0, 3) karena hanya ada 4 item. Lebih tepatnya: $ array [mt_rand (0, count ($ array)]
reko_t
2
Err, saya pikir maksud Anda mt_rand (0, hitung ($ lari) - 1)
Josh Davis
menurut komentar php array_randtidak mt_rand
seacak
1
Apa gunanya seluruh issetbagian? Ini akan gagal untuk array asosiatif.
Luke Cousins
saya tidak tahu mengapa, tetapi ketika menggunakan mt_randdaripada randdalam kasus ini tampaknya lebih memilih beberapa item daripada yang lain
pengguna151496
20
$value = $array[array_rand($array)];
KAS
sumber
14

Anda dapat menggunakan fungsi array_rand untuk memilih kunci acak dari array Anda seperti di bawah ini.

$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];

atau Anda dapat menggunakan fungsi rand dan hitung untuk memilih indeks acak.

$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
Jake
sumber
11

Berasal dari Laravel 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;
}

Pemakaian:

$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];

array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']

Beberapa catatan:

  • $amountharus kurang dari atau sama dengan count($array).
  • array_rand()tidak mengacak kunci (sejak PHP 5.2.10, lihat 48224 ), jadi item yang Anda pilih akan selalu dalam urutan asli. Gunakan shuffle()setelahnya jika perlu.


Dokumentasi: array_rand(),shuffle()


edit: Fungsi Laravel telah berkembang secara nyata sejak saat itu, lihat Laravel 5.4 Arr::random(). Berikut ini sesuatu yang lebih rumit, berasal dari fungsi Laravel dewasa:

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

Beberapa sorotan:

  • Lempar pengecualian jika tidak tersedia cukup item
  • array_random($array, 1)mengembalikan array dari satu item ( # 19826 )
  • Nilai dukungan "0" untuk jumlah item ( # 20439 )
Gras Double
sumber
8

The array_randFungsi tampaknya memiliki distribusi yang tidak merata pada array besar, tidak setiap item array sama-sama mungkin untuk mendapatkan dijemput. Menggunakan shuffle pada larik dan kemudian mengambil elemen pertama tidak memiliki masalah ini:

$myArray = array(1, 2, 3, 4, 5);

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];
Asciiom
sumber
Itu banyak "pekerjaan" komputasi tambahan hanya untuk mendapatkan satu elemen acak. Jawaban lain yang digunakan mt_rand()mungkin lebih cocok untuk tugas tersebut.
rinogo
Tergantung pada apa kebutuhan Anda, saya kira. Dalam kasus saya, distribusi sangat penting dan overhead komputasi tidak.
Asciiom
5

Pendekatan lain melalui flipping array untuk mendapatkan nilai langsung.

Potongan

$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));

array_randkembali kunci bukan nilai. Jadi, kami membalik nilai sebagai kuncinya.

Catatan: Kunci PHP selalu merupakan kunci unik, jadi ketika array dibalik, nilai duplikat sebagai kunci akan ditimpa.

Smartpal
sumber
Kenapa tidak lakukan saja $array[array_rand($array)];?
rinogo
@rinogo Ini bekerja juga, Ini sudah dijawab di atas. Ini sedikit berbeda dengan jawaban Anda, array_fliphapus duplikat sebagai kunci lalu berikan hasil ... Berarti tidak ada duplikat!
Smartpal
4
$rand = rand(1,4);

atau, untuk larik khusus:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Duroth
sumber
2
Anda tidak akan pernah mendapatkan item pertama dalam daftar ini dan Anda akan keluar dari array dengan 4
Ólafur Waage
$ Rand pertama adalah tentang nilai. Array asli memiliki nilai mulai dari 1 hingga 4. $ Rand kedua adalah tentang kunci array, 0 hingga 3.
Josh Davis
3

Dalam kasus saya, saya harus mendapatkan 2 nilai apa itu objek. Saya membagikan solusi sederhana ini.

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

Apakah pilihan Anda memiliki implikasi keamanan? Jika ya, gunakan random_int()dan array_keys(). ( random_bytes()hanya untuk PHP 7, tetapi ada polyfill untuk PHP 5 ).

function random_index(array $source)
{
    $max = count($source) - 1;
    $r = random_int(0, $max);
    $k = array_keys($source);
    return $k[$r];
}

Pemakaian:

$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

Scott Arciszewski
sumber
2

Gunakan rand () untuk mendapatkan nomor acak untuk menggemakan kunci acak. Misalnya: 0 - 3

$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
Muhammad Ibnuh
sumber
2

Satu baris: $ran[rand(0, count($ran) - 1)]

Abdelilah
sumber
2

Saya membutuhkan satu versi baris untuk larik pendek:

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

atau jika array diperbaiki:

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

On-liner:

echo $array[array_rand($array,1)]
Sid
sumber
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan mengenai mengapa dan / atau bagaimana kode ini menjawab pertanyaan tersebut meningkatkan nilai jangka panjangnya.
β.εηοιτ.βε
1

Ini akan bekerja dengan baik dengan array sebaris. Selain itu, saya pikir semuanya lebih rapi dan lebih dapat digunakan kembali ketika dibungkus dalam suatu fungsi.

function array_rand_value($a) {
    return $a[array_rand($a)];
}

Pemakaian:

array_rand_value(array("a", "b", "c", "d"));

Di PHP <7.1.0, array_rand()gunakan rand(), jadi Anda tidak ingin menggunakan fungsi ini untuk apa pun yang berhubungan dengan keamanan atau kriptografi. Pada PHP 7.1.0+, gunakan fungsi ini tanpa khawatir karena rand()telah dialirimt_rand() .

rinogo
sumber
0

Saya mendasarkan jawaban saya dari fungsi @ ÓlafurWaage. Saya mencoba menggunakannya tetapi mengalami masalah referensi ketika saya mencoba untuk mengubah objek pengembalian. Saya memperbarui fungsinya untuk lulus dan kembali dengan referensi. Fungsi barunya adalah:

function &random_value(&$array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    if (isset($array[$k])) {
        return $array[$k];
    } else {
        return $default;
    }
}

Untuk konteks lebih lanjut, lihat pertanyaan saya di Passing / Returning referensi ke objek + mengubah objek tidak berfungsi

Jeff
sumber
0

Cara sederhana untuk mendapatkan nilai Randdom dari Array .

$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)

sekarang setiap kali Anda akan mendapatkan warna yang berbeda dari Array .

pankaj kumar
sumber
-5

Anda mendapatkan nomor acak dari larik sebagai berikut:

$randomValue = $rand[array_rand($rand,1)];
Adam Libonatti-Roche
sumber
4
array_rand () mengembalikan kunci acak, bukan nilai acak.
reko_t