Làm cách nào để lấy giá trị ngẫu nhiên ra khỏi một mảng?


123

Tôi có một mảng được gọi là $ran = array(1,2,3,4);

Tôi cần lấy một giá trị ngẫu nhiên từ mảng này và lưu trữ nó trong một biến, làm cách nào để thực hiện việc này?

Câu trả lời:


232

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.


11
theo này bình luận array_rand không phải là ngẫu nhiên như nó phải được
Timo Huovinen

1
Hoặc bạn có thể yêu cầu gói này và sử dụngarray_rand_value
giết

10
Kể từ PHP 7.1, 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.
Gras Double

32

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

3
Giá trị mặc định của đối số thứ hai của array_randhàm là 1vì vậy không cần phải viết nó.
Nabi KAZ

23

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

4
Nên là mt_rand (0, 3) vì chỉ có 4 mục. Một cách chính xác hơn mặc dù: $ array [mt_rand (0, count ($ array)]
reko_t

2
Ồ, tôi nghĩ ý bạn là mt_rand (0, count ($ ran) - 1)
Josh Davis

theo ý kiến php array_randkhông phải là ngẫu nhiên như nó phải được, vì vậy mt_randđược ưa thích
Timo Huovinen

1
Điểm mấu chốt trong toàn bộ issetphầ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.
Luke Cousins

tôi không biết tại sao, nhưng khi sử dụng mt_randthay vì randtrong 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
user151496


14

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

11

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 ý:

  • $amountphả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:

  • Bỏ ngoại lệ nếu không có đủ mặt hàng
  • array_random($array, 1)trả về một mảng gồm một mục ( # 19826 )
  • Giá trị hỗ trợ "0" cho số lượng mặt hàng ( # 20439 )

8

Các array_randchứ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];

Tuy nhiên, đó là rất nhiều "công việc" tính toán bổ sung chỉ để có được một phần tử ngẫu nhiên duy nhất. Các câu trả lời khác mt_rand()được sử dụng có lẽ phù hợp hơn với nhiệm vụ.
rinogo

Tôi cho rằng phụ thuộc vào nhu cầu của bạn là gì. Trong trường hợp của tôi, phân phối là rất quan trọng và chi phí tính toán thì không.
Asciiom

5

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_randkhó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 đè.


Tại sao không chỉ làm $array[array_rand($array)];?
rinogo

@rinogo Nó cũng hoạt động, Điều này đã được trả lời ở trên. Điều này hơi khác một chút so với câu trả lời của bạn, hãy array_flipxóa bản sao làm khóa sau đó đưa ra kết quả ... Có nghĩa là không có bản sao!
Smartpal

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

2
Bạn sẽ không bao giờ có được mục đầu tiên trong danh sách này và bạn sẽ đi ra ngoài mảng với 4
Ólafur Waage

$ Rand đầu tiên là về các giá trị. Mảng ban đầu có giá trị từ 1 đến 4. $ rand thứ hai là về các phím mảng, từ 0 đến 3.
Josh Davis

3

Trong trường hợp của tôi, tôi phải nhận 2 giá trị là các đối tượng. Tôi chia sẻ giải pháp đơn giản này.

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

2

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()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


2

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


2

Tôi cần một phiên bản dòng cho mảng ngắn:

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

hoặc nếu mảng là cố định:

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

2

Trên lớp lót:

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

Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
β.εηοιτ.βε Ngày

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() .


0

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


0

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 .


-5

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

4
array_rand () trả về một khóa ngẫu nhiên, không phải một giá trị ngẫu nhiên.
reko_t
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.