Как получить случайное значение из массива
У меня есть массив под названием $ran = array(1,2,3,4);
Мне нужно получить случайное значение из этого массива и сохранить его в переменной, как я могу это сделать?
21 ответ
Вы также можете сделать только:
$k = array_rand($array);
$v = $array[$k];
Это способ сделать это, когда у вас есть ассоциативный массив.
PHP предоставляет функцию только для этого: array_rand ()
http://php.net/manual/en/function.array-rand.php
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
Вы можете использовать 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;
}
Вы можете использовать функцию 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)];
Другой подход с помощью переворачивания массива для получения прямого значения.
отрывок
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
ключ возврата не значение. Итак, мы переключаем значение в качестве ключа.
Примечание: ключ PHP всегда должен быть уникальным ключом, поэтому при переворачивании массива дублирующее значение в качестве ключа будет перезаписано.
Получено из 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()
редактирование: функция 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_rand
В больших массивах функция распределена неравномерно, и не каждый элемент массива одинаково вероятен. Использование shuffle в массиве, а затем взятие первого элемента не имеет этой проблемы:
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
$rand = rand(1,4);
или специально для массивов:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
В моем случае мне нужно получить 2 значения, которые являются объектами. Я разделяю это простое решение.
$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));
Это будет хорошо работать с встроенными массивами. Кроме того, я думаю, что все становится более аккуратным и более пригодным для повторного использования, когда оно оборачивается функцией.
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()
.
Мне нужна была однострочная версия для короткого массива:
($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]
или если массив зафиксирован:
[1, 2, 3, 4][mt_rand(0, 3]
Имеет ли ваш выбор какие-либо последствия для безопасности? Если так, используйте random_int()
а также array_keys()
, (random_bytes()
это только PHP 7, но для PHP 5 есть polyfill).
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
Используйте rand(), чтобы получить случайное число, чтобы повторить случайный ключ. Например: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
Получить случайные значения из массива.
function random($array)
{
/// Determine array is associative or not
$keys = array_keys($array);
$givenArrIsAssoc = array_keys($keys) !== $keys;
/// if array is not associative then return random element
if(!$givenArrIsAssoc){
return $array[array_rand($array)];
}
/// If array is associative then
$keys = array_rand($array, $number);
$results = [];
foreach ((array) $keys as $key) {
$results[] = $array[$key];
}
return $results;
}
mt_srand
пример использования
если нужно выбрать случайную строку из текста, но все время одно и то же на основе чего-то
$rows = array_map('trim', explode("\n", $text));
mt_srand($item_id);
$row = $rows[rand(0, count($rows ) - 1)];
Я основываю свой ответ на функции @ÓlafurWaage. Я пытался использовать его, но столкнулся с проблемами со ссылками, когда пытался изменить возвращаемый объект. Я обновил его функцию, чтобы передать и вернуться по ссылке. Новая функция:
function &random_value(&$array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
if (isset($array[$k])) {
return $array[$k];
} else {
return $default;
}
}
Для получения дополнительной информации см. Мой вопрос в разделе " Передача / возврат ссылок на объект + изменение объекта не работает".
Простой способ получить значение Randdom из массива.
$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)
теперь каждый раз вы будете получать разные цвета от Array.
Вы получаете случайное число из массива следующим образом:
$randomValue = array_rand($rand,1);