Відповіді:
Ви також можете зробити лише:
$k = array_rand($array);
$v = $array[$k];
Це спосіб зробити це, коли у вас є асоціативний масив.
array_rand()
використовується генератор Mersenne Twister: rand (), псевдонім mt_rand () та srand (), псевдонім mt_srand () . На практиці це повинно бути зараз досить добре.
PHP забезпечує функцію саме для цього: array_rand ()
http://php.net/manual/en/function.array-rand.php
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
array_rand
функції, 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
, не так випадково, як слід, тому mt_rand
бажано
isset
частині? Це все одно не вдасться для асоціативних масивів.
mt_rand
замість rand
цього випадку здається, що деякі елементи віддають перевагу більше, ніж інші
Ви можете використовувати функцію array_rand для вибору випадкового ключа з масиву, як показано нижче.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];
або ви можете використовувати функції rand і підрахунок, щоб вибрати випадковий індекс.
$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
Отримано від 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's 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
Функція , здається, має нерівномірний розподіл на великих масивах, не кожен елемент масиву з однаковою ймовірністю отримати взяв. Використання перетасування в масиві та взяття першого елемента не має такої проблеми:
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
mt_rand()
, ймовірно, краще підходять до завдання.
Інший підхід через гортаючи масив, щоб отримати пряме значення.
Знімок
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
ключ повернення не значення. Отже, ми гортаємо значення як ключове.
Примітка: ключ PHP завжди є унікальним ключем, тому при переверненні масиву повторне значення як ключ буде перезаписано.
$array[array_rand($array)];
?
array_flip
видаліть дублікат як ключ, а потім дайте результат ... Майте на увазі не дублікат!
$rand = rand(1,4);
або, зокрема, для масивів:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
Чи має ваш вибір якісь наслідки для безпеки? Якщо так, використовуйте 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
Використовуйте rand (), щоб отримати випадкове число для відлуння випадкового ключа. Наприклад: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
On-line:
echo $array[array_rand($array,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()
.
Я базую свою відповідь на функції @ Ó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 = $rand[array_rand($rand,1)];
array_rand
не так випадково, як це має бути