Jawaban:
Anda juga dapat melakukan hanya:
$k = array_rand($array);
$v = $array[$k];
Ini adalah cara untuk melakukannya ketika Anda memiliki array asosiatif.
array_rand()menggunakan generator Twister Mersenne: rand () dengan alias mt_rand () dan srand () dengan alias mt_srand () . Dalam prakteknya sekarang sudah cukup baik.
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)];
array_randfungsi kedua 1jadi tidak perlu menulisnya.
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;
}
array_randtidak mt_rand
issetbagian? Ini akan gagal untuk array asosiatif.
mt_randdaripada randdalam kasus ini tampaknya lebih memilih beberapa item daripada yang lain
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)];
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:
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];
mt_rand()mungkin lebih cocok untuk tugas tersebut.
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.
$array[array_rand($array)];?
array_fliphapus duplikat sebagai kunci lalu berikan hasil ... Berarti tidak ada duplikat!
$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) ];
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
Gunakan rand () untuk mendapatkan nomor acak untuk menggemakan kunci acak. Misalnya: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
On-liner:
echo $array[array_rand($array,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() .
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
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 .
Anda mendapatkan nomor acak dari larik sebagai berikut:
$randomValue = $rand[array_rand($rand,1)];
array_randini tidak