Answers:
您还可以执行以下操作:
$k = array_rand($array);
$v = $array[$k];
当您有关联数组时,这就是这样做的方法。
array_rand_value
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
function 的第二个参数的默认值为,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
似乎更喜欢某些物品
衍生自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()
如果需要,请稍后使用。
编辑:从那时起,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];
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有一个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]]);
班轮:
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;
}
}
有关更多上下文,请参阅通过/返回对象的引用+更改对象不起作用
您从数组中得到一个随机数,如下所示:
$randomValue = $rand[array_rand($rand,1)];
array_rand
,它并没有应有的随机性