【问题标题】:How to get random value out of an array?如何从数组中获取随机值?
【发布时间】:2010-12-11 05:38:26
【问题描述】:

我有一个名为$ran = array(1,2,3,4);的数组

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

【问题讨论】:

    标签: php arrays random


    【解决方案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;
    }
    

    【讨论】:

    • 应该是 mt_rand(0, 3) 因为只有 4 个项目。不过更正确的是: $array[mt_rand(0, count($array)]
    • 呃,我想你的意思是 mt_rand(0, count($ran) - 1)
    • 根据 php cmets array_rand 没有应有的随机性,所以首选mt_rand
    • 整个isset 部分有什么意义?无论如何,这对于关联数组都会失败。
    • 我不知道为什么,但是在这种情况下使用mt_rand 而不是rand 似乎更喜欢某些项目而不是其他项目
    【解决方案2】:
    $rand = rand(1,4);
    

    或者,专门针对数组:

    $array = array('a value', 'another value', 'just some value', 'not some value');
    $rand = $array[ rand(0, count($array)-1) ];
    

    【讨论】:

    • 你永远不会得到这个列表中的第一个项目,你会用 4 离开数组
    • 第一个 $rand 是关于价值观的。原始数组的值范围是 1 到 4。第二个 $rand 是关于数组键,0 到 3。
    【解决方案3】:

    你从一个数组中得到一个随机数如下:

    $randomValue = $rand[array_rand($rand,1)];
    

    【讨论】:

    • array_rand() 返回随机键,而不是随机值。
    【解决方案4】:

    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,所以不用写了。
    【解决方案5】:

    你也可以这样做:

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

    当你有一个关联数组时,这是这样做的。

    【讨论】:

    【解决方案6】:

    您可以使用 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)];
    

    【讨论】:

      【解决方案7】:

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

      $myArray = array(1, 2, 3, 4, 5);
      
      // Random shuffle
      shuffle($myArray);
      
      // First element is random now
      $randomValue = $myArray[0];
      

      【讨论】:

      • 不过,为了获得单个随机元素,需要进行大量额外的计算“工作”。使用mt_rand() 的其他答案可能更适合该任务。
      • 我想这取决于您的需求。就我而言,分布非常重要,而计算开销则不是。
      【解决方案8】:
      $value = $array[array_rand($array)];
      

      【讨论】:

        【解决方案9】:

        我的答案基于@ÓlafurWaage 的功能。我尝试使用它,但在尝试修改返回对象时遇到了参考问题。我更新了他的函数以通过引用传递和返回。新功能是:

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

        有关更多上下文,请参阅我的问题Passing/Returning references to object + changing object is not working

        【讨论】:

          【解决方案10】:

          源自 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

          【讨论】:

            【解决方案11】:

            您的选择是否有任何安全隐患?如果是这样,请使用random_int()array_keys()。 (random_bytes() 仅适用于 PHP 7,但有一个 polyfill for 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

            【讨论】:

              【解决方案12】:

              使用 rand() 获取随机数来回显随机密钥。例如:0 - 3

              $ran = array(1,2,3,4);
              echo $ran[rand(0,3)];
              

              【讨论】:

                【解决方案13】:

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

                片段

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

                array_rand 返回键不是值。所以,我们将价值作为关键。

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

                【讨论】:

                • 为什么不直接做$array[array_rand($array)];
                • @rinogo 这也有效,上面已经回答了。这与您的回答略有不同,array_flip 删除重复项作为键然后给出结果...意味着没有重复项!
                • 要转义重复的键,您可以使用以下语法(在第二行):$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jane' ]; $val = array_rand(array_flip(array_unique($array)));
                【解决方案14】:

                一行:$ran[rand(0, count($ran) - 1)]

                【讨论】:

                  【解决方案15】:

                  这将很好地与内联数组一起使用。另外,我认为将事物封装在一个函数中时会更整洁,更可重用。

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

                  用法:

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

                  在 PHP array_rand() 使用 rand(),因此您不希望将此函数用于与安全或密码学相关的任何事情。在 PHP 7.1.0+ 上,使用此函数无需担心,因为 rand() has been aliased to mt_rand()

                  【讨论】:

                    【解决方案16】:

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

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

                    【讨论】:

                      【解决方案17】:

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

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

                      或者如果数组是固定的:

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

                      【讨论】:

                        【解决方案18】:

                        一种从数组中获取随机值的简单方法。

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

                        现在每次你都会从Array中得到不同的颜色。

                        【讨论】:

                          【解决方案19】:

                          在线:

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

                          【讨论】:

                          • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
                          【解决方案20】:

                          从数组中获取随机值。

                          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;
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2020-08-07
                            • 2017-12-29
                            • 1970-01-01
                            • 2018-06-19
                            • 1970-01-01
                            相关资源
                            最近更新 更多