Câu trả lời:
Bạn cũng có thể làm chỉ:
$k = array_rand($array);
$v = $array[$k];
Đây là cách để làm điều đó khi bạn có một mảng liên kết.
array_rand()
sử dụng trình tạo Mersenne Twister: rand () có bí danh là mt_rand () và srand () được đặt bí danh là mt_srand () . Trong thực tế, bây giờ nó đã đủ tốt.
PHP cung cấp một hàm chỉ dành cho điều đó: array_rand () http://php.net/manual/en/ Chức năng.array-rand.php
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
array_rand
hàm là 1
vì vậy không cần phải viết nó.
Bạn có thể sử dụng mt_rand ()
$random = $ran[mt_rand(0, count($ran) - 1)];
Điều này cũng hữu ích như một chức năng nếu bạn cần giá trị
function random_value($array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
return isset($array[$k])? $array[$k]: $default;
}
array_rand
không phải là ngẫu nhiên như nó phải được, vì vậy mt_rand
được ưa thích
isset
phần này là gì? Điều này sẽ không thành công đối với các mảng liên kết.
mt_rand
thay vì rand
trong trường hợp này có vẻ thích một số mặt hàng hơn những người khác
Bạn có thể sử dụng hàm array_rand để chọn một khóa ngẫu nhiên từ mảng của mình như bên dưới.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];
hoặc bạn có thể sử dụng hàm rand và count để chọn một chỉ mục ngẫu nhiên.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
Bắt nguồn từ 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;
}
Sử dụng:
$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];
array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']
Một số lưu ý:
$amount
phải nhỏ hơn hoặc bằng count($array)
.array_rand()
không xáo trộn các khóa (kể từ phiên bản PHP 5.2.10 , xem 48224 ), vì vậy các mục đã chọn của bạn sẽ luôn ở thứ tự ban đầu. Sử dụng shuffle()
sau đó nếu cần.
Tài liệu: array_rand()
,shuffle()
chỉnh sửa: Chức năng Laravel đã phát triển đáng kể kể từ đó, xem Laravel 5.4's Arr::random()
. Đây là một cái gì đó phức tạp hơn, bắt nguồn từ hàm Laravel đã trưởng thành:
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;
}
Một vài điểm nổi bật:
Các array_rand
chức năng dường như có một phân bố không đều trên mảng lớn, không phải mọi mục mảng cũng không kém phần khả năng được chọn. Sử dụng xáo trộn trên mảng và sau đó lấy phần tử đầu tiên không có vấn đề này:
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
mt_rand()
được sử dụng có lẽ phù hợp hơn với nhiệm vụ.
Một cách tiếp cận khác thông qua việc lật mảng để nhận giá trị trực tiếp.
Đoạn trích
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
khóa trả về không phải giá trị. Vì vậy, chúng tôi đang lật giá trị làm chìa khóa.
Lưu ý: Khóa PHP luôn là một khóa duy nhất, vì vậy khi mảng được lật, giá trị trùng lặp làm khóa sẽ bị ghi đè.
$array[array_rand($array)];
?
array_flip
xóa bản sao làm khóa sau đó đưa ra kết quả ... Có nghĩa là không có bản sao!
$rand = rand(1,4);
hoặc đối với các mảng cụ thể:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Lựa chọn của bạn có bất kỳ tác động bảo mật nào không? Nếu vậy, hãy sử dụng random_int()
và array_keys()
. (chỉ random_bytes()
là PHP 7, nhưng có một polyfill cho PHP 5 ).
function random_index(array $source)
{
$max = count($source) - 1;
$r = random_int(0, $max);
$k = array_keys($source);
return $k[$r];
}
Sử dụng:
$array = [
'apple' => 1234,
'boy' => 2345,
'cat' => 3456,
'dog' => 4567,
'echo' => 5678,
'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);
Bản trình diễn: https://3v4l.org/1joB1
Sử dụng hàm rand () để lấy số ngẫu nhiên để lặp lại khóa ngẫu nhiên. Ví dụ: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
Trên lớp lót:
echo $array[array_rand($array,1)]
Điều này sẽ hoạt động tốt với các mảng trong dòng. Thêm vào đó, tôi nghĩ rằng mọi thứ gọn gàng hơn và có thể tái sử dụng nhiều hơn khi được gói gọn trong một hàm.
function array_rand_value($a) {
return $a[array_rand($a)];
}
Sử dụng:
array_rand_value(array("a", "b", "c", "d"));
Trên PHP <7.1.0, array_rand()
sử dụng rand()
, vì vậy bạn sẽ không muốn hàm này cho bất kỳ thứ gì liên quan đến bảo mật hoặc mật mã. Trên PHP 7.1.0+, hãy sử dụng hàm này mà không cần quan tâm vì nó rand()
đã được đặt bí danh chomt_rand()
.
Tôi đang dựa trên câu trả lời của mình về chức năng của @ ÓlafurWaage. Tôi đã cố gắng sử dụng nó nhưng gặp phải sự cố tham chiếu khi tôi cố gắng sửa đổi đối tượng trả về. Tôi đã cập nhật chức năng của anh ấy để chuyển và trả về bằng cách tham khảo. Chức năng mới là:
function &random_value(&$array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
if (isset($array[$k])) {
return $array[$k];
} else {
return $default;
}
}
Để biết thêm ngữ cảnh, hãy xem câu hỏi của tôi tại Chuyển / Trả lại tham chiếu đến đối tượng + đối tượng thay đổi không hoạt động
Một cách đơn giản để nhận dạng giá trị Randdom Array .
$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)
bây giờ mỗi lần bạn sẽ nhận được các màu khác nhau từ Array .
Bạn nhận được một số ngẫu nhiên từ một mảng như sau:
$randomValue = $rand[array_rand($rand,1)];
array_rand
không phải là ngẫu nhiên như nó phải được