【问题标题】:How do I select random values from an array in PHP?如何从 PHP 中的数组中选择随机值?
【发布时间】:2011-04-08 00:55:29
【问题描述】:

我在 PHP 中有一个对象数组。我需要随机选择其中的 8 个。我最初的想法是使用 array_rand(array_flip($my_array), 8) 但这不起作用,因为对象不能充当数组的键。

我知道我可以使用shuffle,但是随着数组大小的增加,我担心性能问题。这是最好的方法,还是有更有效的方法?

【问题讨论】:

    标签: php arrays random


    【解决方案1】:
    $result = array();
    foreach( array_rand($my_array, 8) as $k ) {
      $result[] = $my_array[$k];
    }
    

    【讨论】:

      【解决方案2】:
      $array = array();
      shuffle($array); // randomize order of array items
      $newArray = array_slice($array, 0, 8);
      

      注意shuffle() 函数将参数作为参考并对其进行更改。

      【讨论】:

      • 无循环。这是一个很好的解决方案。
      • @Chords 你可以打赌shufflearray_slice 包含一些循环。 :)
      • 摸摸,但至少不用看!
      • 史诗!谢谢
      【解决方案3】:

      您可以使用array_rand 随机选择密钥,使用foreach 收集对象:

      $objects = array();
      foreach (array_rand($my_array, 8) as $key) {
          $objects[] = $my_array[$key];
      }
      

      【讨论】:

      • 因为它返回的是数组键,而不是值?
      • @Chris,这就是你使用$my_array[$key]的原因。
      • @Chris B.:我改写了我的答案。 :)
      • 过早扣动扳机,然后在事后纠正你的答案是没有意义的。这要归功于第一次做对的人。
      【解决方案4】:

      怎么样?

      $count = count($my_array);
      for ($i = 0; $i < 8; $i++) {
        $x = rand(0, $count);
        $my_array[$x];
      }

      【讨论】:

        【解决方案5】:

        我刚刚在我们的代码中发现了这个,并希望找到一个更具可读性的解决方案:

        $rand = array_intersect_key($all, array_flip(array_rand($all, $count)));
        

        【讨论】:

          【解决方案6】:

          您可以使用此函数从数组中获取多个随机元素:

             function getRandomElements(array $array): array
              {
                  $result = [];
          
                  $count = count($array);
                  for ($i = 0; $i < rand(0, $count); $i++) {
                      $result[] = rand(0, $count);
                  }
                  $result = array_unique($result);
                  sort($result);
          
                  return $result;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-29
            • 1970-01-01
            • 2012-02-21
            • 2020-11-18
            • 2015-12-22
            • 1970-01-01
            • 1970-01-01
            • 2019-07-30
            相关资源
            最近更新 更多