Как получить случайное значение из массива?

У меня есть массив с именем $ran = array(1,2,3,4);

Мне нужно получить случайное значение из этого массива и сохранить его в переменной, как я могу это сделать?

Ответ 1

Вы также можете сделать только:

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

Это способ сделать это, когда у вас есть ассоциативный массив.

Ответ 3

Вы можете использовать mt_rand()

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

Это также полезно, как функция, если вам нужно значение

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

Ответ 4

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

Ответ 5

Вы можете использовать функцию array_rand для выбора случайного ключа из вашего массива, как показано ниже.

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

или вы можете использовать функции rand и count для выбора случайного индекса.

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

Ответ 6

Получено из Collection::random() 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;
}

Использование:

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

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

Несколько заметок:

  • $amount должно быть меньше или равно count($array).
  • array_rand() не array_rand() ключи (начиная с PHP 5.2.10, см. 48224), поэтому выбранные вами элементы всегда будут в исходном порядке. При необходимости используйте shuffle().


Документация: array_rand(), shuffle()


edit: функция Laravel заметно выросла с тех пор, см. Laravel 5.4 Arr::random(). Вот что-то более сложное, полученное из взрослой функции Laravel:

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

Несколько основных моментов:

  • Бросьте исключение, если не хватает предметов
  • array_random($array, 1) возвращает массив из одного элемента (# 19826)
  • Значение поддержки "0" для количества элементов (# 20439)

Ответ 7

Функция array_rand, по-видимому, имеет неравномерное распределение на больших массивах, но не каждый элемент массива в равной степени может быть выбран. Используя shuffle в массиве, а затем, взяв первый элемент, эта проблема не возникает:

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];

Ответ 8

Другой подход - перевернуть массив, чтобы получить прямое значение.

отрывок

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

array_rand ключ возврата не значение. Итак, мы переключаем значение в качестве ключа.

Примечание. Ключ PHP всегда должен быть уникальным, поэтому при переворачивании массива дублирующее значение в качестве ключа будет перезаписано.

Ответ 9

$rand = rand(1,4);

или, для конкретных массивов:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];

Ответ 10

Есть ли у вашего выбора какие-либо последствия для безопасности? Если это так, используйте random_int() и array_keys(). (random_bytes()только PHP 7, но есть polyfill для PHP 5).

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

Использование:

$array = [
    'apple' =>   1234,
    'boy'   =>   2345,
    'cat'   =>   3456,
    'dog'   =>   4567,
    'echo'  =>   5678,
    'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);

Демо: https://3v4l.org/1joB1

Ответ 11

Используйте rand(), чтобы получить случайное число для эхо-случайного ключа. В ех: 0 - 3

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

Ответ 12

В моем случае я должен получить 2 значения объектов. Я разделяю это простое решение.

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

Ответ 13

Я основываю свой ответ на функции @ÓlafurWaage. Я попытался использовать его, но столкнулся со справочными проблемами, когда попытался изменить возвращаемый объект. Я обновил его функцию для передачи и возврата по ссылке. Новая функция:

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

Более подробно см. мой вопрос в Передача/Возврат ссылок на объект + изменение объекта не работает

Ответ 14

Одна строка: $ran[rand(0, count($ran) - 1)]

Ответ 15

Это будет хорошо работать с встроенными массивами. Плюс, я думаю, что вещи более аккуратны и более пригодны для повторного использования, когда они заключены в функцию.

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

Использование:

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

В PHP < array_rand() использует rand(), поэтому вы не захотите использовать эту функцию для чего-либо, связанного с безопасностью или криптографией. На PHP 7.1. 0+, используйте эту функцию без беспокойства, так как rand() был связан с mt_rand().

Ответ 16

Мне нужна однострочная версия для короткого массива:

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

или если массив фиксирован:

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

Ответ 17

Другая альтернатива чистым Mysql:

$result = mysql_query("select group_id from menu_groups 
        group by group_id
        order by rand()
        limit 1");

$rand_group= mysql_fetch_row($result);
$rand_group_id= $rand_group['group_id'];

Ответ 18

Вы получаете случайное число из массива следующим образом:

$randomValue = array_rand($rand,1);