如何从数组中获取随机值?


123

我有一个数组叫做 $ran = array(1,2,3,4);

我需要从该数组中获取一个随机值并将其存储在变量中,我该怎么做?

Answers:


232

您还可以执行以下操作:

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

当您有关联数组时,这就是这样做的方法。


11
根据此评论 array_rand,它并没有应有的随机性
Timo Huovinen

1
或者,您可以要求此包装并使用array_rand_value
murze 2015年

10
从PHP 7.1开始,array_rand()使用Mersenne Twister生成器:rand()别名为mt_rand()和srand()别名为mt_srand()。实际上,它现在应该已经足够好了。
Gras Double


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 2009年

2
错误,我认为您的意思是mt_rand(0,count($ ran)-1)
乔什·戴维斯

根据PHP的评论array_rand不是应该的随机,所以mt_rand首选
Timo Huovinen 2014/10/23

1
整个isset部分有什么意义?无论如何,这对于关联数组将失败。
路加·考辛斯

我不知道为什么,但是在这种情况下使用mt_rand代替时rand似乎更喜欢某些物品
user151496


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()


编辑:从那时起,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

8

array_rand函数似乎在大型数组上分布不均,并非每个数组项都同样有可能被选中。在数组上使用shuffle然后采用第一个元素不会出现此问题:

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

// Random shuffle
shuffle($myArray);

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

不过,要获得一个随机元素,还有很多额外的计算“工作”。使用的其他答案mt_rand()可能更适合该任务。
rinogo '19

我想取决于您的需求。就我而言,分布非常重要,而计算开销却不重要。
Asciiom

5

另一种通过翻转数组获得直接价值的方法。

片段

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

array_rand返回键不值。因此,我们将价值作为关键。

注意: PHP键始终是唯一键,因此当数组被翻转时,作为键的重复值将被覆盖。


为什么不做$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) ];

2
您将永远不会获得此列表中的第一项,并且您将以4
–ÓlafurWaage的

第一个$ rand与价值有关。原始阵列具有值范围从1到4的第二个$兰特为约数组键,0到3
约什戴维斯

3

就我而言,我必须获得2个值即对象。我分享这个简单的解决方案。

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

2

您的选择是否有安全隐患?如果是这样,请使用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




2

我需要一个行版本的短数组:

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

或者数组是固定的:

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

2

班轮:

echo $array[array_rand($array,1)]

尽管此代码可以回答问题,但提供有关此代码为什么和/或如何回答问题的其他上下文,可以改善其长期价值。
β.εηοιτ.βε

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()


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

Array获取Randdom值的简单方法。

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

现在每次您都会从Array获得不同的颜色。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.