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

124

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

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

Elitmiar
источник

Ответы:

232

Вы также можете просто:

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

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

reko_t
источник
11
согласно этому комментарию array_rand не так случайен, как должен быть
Timo Huovinen
1
Или вы можете запросить этот пакет и использоватьarray_rand_value
murze
10
Начиная с PHP 7.1, array_rand()используется генератор Mersenne Twister: rand () с псевдонимом mt_rand () и srand () с псевдонимом mt_srand () . На практике теперь должно быть достаточно.
Gras Double
32

PHP предоставляет функцию только для этого: array_rand ()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
НДД
источник
3
По умолчанию второй аргумент array_randфункции имеет значение, 1поэтому писать его не нужно.
Наби КАЗ
23

Вы можете использовать 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
Должно быть mt_rand (0, 3), так как всего 4 элемента. Однако более правильно: $ array [mt_rand (0, count ($ array)]
reko_t
2
Эээ, я думаю, вы имели в виду mt_rand (0, count ($ ran) - 1)
Джош Дэвис,
согласно комментариям php array_randне так случайен, как должен быть, поэтому mt_randпредпочтительнее
Тимо Хуовинен
1
Какой смысл во всей issetчасти? В любом случае это не сработает для ассоциативных массивов.
Люк Казинс,
я не знаю почему, но при использовании mt_randвместо randв этом случае кажется, что некоторые предметы предпочитают больше, чем другие
user151496 09
14

Вы можете использовать функцию 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)];
Джейк
источник
11

Получено из 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()не перемешивает ключи (начиная с 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 )
Gras Double
источник
8

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

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];
Asciiom
источник
Тем не менее, требуется много дополнительной вычислительной «работы», чтобы получить единственный случайный элемент. Другие ответы, которые используются mt_rand(), вероятно, лучше подходят для этой задачи.
rinogo
Я полагаю, это зависит от ваших потребностей. В моем случае распределение было очень важным, а накладные расходы на вычисления - нет.
Asciiom
5

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

отрывок

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

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

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

SmartPal
источник
Почему бы просто не сделать $array[array_rand($array)];?
rinogo
@rinogo Это тоже работает, Об этом уже ответили выше. Это немного отличается от вашего ответа, array_flipудалите дубликат как ключ, затем дайте результат ... Значит, дубликатов нет!
Smartpal
4
$rand = rand(1,4);

или, в частности, для массивов:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Duroth
источник
2
Вы никогда не получите первый элемент в этом списке, и вы бы вышли за пределы массива с 4
Ólafur Waage
Первый $ rand касается ценностей. Исходный массив имеет значения от 1 до 4. Второй $ rand относится к ключам массива, от 0 до 3.
Джош Дэвис,
3

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

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));
CN Lee
источник
2

Имеет ли ваш выбор какие-либо последствия для безопасности? Если да, используйте random_int()и array_keys(). ( random_bytes()только PHP 7, но есть полифилл для 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

Скотт Арцишевски
источник
2

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

$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
Мухаммад Ибнух
источник
2

Одна линия: $ran[rand(0, count($ran) - 1)]

Abdelilah
источник
2

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

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

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

[1, 2, 3, 4][mt_rand(0, 3]
Рафаэль
источник
2

On-вкладыш:

echo $array[array_rand($array,1)]
Sid
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.
β.εηοιτ.βε
1

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

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

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

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

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

rinogo
источник
0

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

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

Для получения дополнительной информации см. Мой вопрос в разделе Передача / возврат ссылок на объект + изменение объекта не работает

Джефф
источник
0

Простой способ получить значение Randdom из массива .

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

теперь каждый раз вы будете получать разные цвета от Array .

панкадж кумар
источник
-5

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

$randomValue = $rand[array_rand($rand,1)];
Адам Либонатти-Рош
источник
4
array_rand () возвращает случайный ключ, а не случайное значение.
reko_t