【问题标题】:PHP selecting only 4 from multidimensional array and shufflingPHP从多维数组中仅选择4并改组
【发布时间】:2014-02-25 16:32:22
【问题描述】:

我有以下 PHP 多维数组,我希望尝试选择 4 个随机项目,然后用标题、图像和文本显示它们。使用我使用的代码,我似乎得到了一个随机的数字,而不是我需要的。

<?php
$arr = array(
        array(
            "image" => "",
            "title" => "Open 7 days.",
            "text" => "We’re open 7 days a week."
        ),
        array(
            "image" => "",
            "title" => "Well done",
            "text" => "Well done you done great."
        ),
        array(
            "image" => "",
            "title" => "Rice",
            "text" => "Various flavours"
        ),
        array(
            "image" => "",
            "title" => "Rooms",
            "text" => "Roomy rooms for a roomyful time"
        ),
        array(
            "image" => "",
            "title" => "Keep in touch.",
            "text" => "Stay in touchwith us as we'll miss you"
        ),
        array(
            "image" => "",
            "title" => "Location",
            "text" => "We'll show you where we are."
        ),
        array(
            "image" => "",
            "title" => "The Home",
            "text" => "See our home page"
        )
    );

    print_r(array_rand($arr));

【问题讨论】:

    标签: php arrays function multidimensional-array


    【解决方案1】:

    如果您只选择一个条目,array_rand() 会为随机条目返回一个键。如果您使用num 指定应选取多少个键,则它返回num 随机条目的键数。

    该函数只返回随机条目的键,而不是数组块本身。您必须根据返回的键手动构建数组:

    // get the random keys
    $keys = array_rand($arr, 4);
    
    // initialize result array
    $result = array();
    
    // loop through the keys and build the array
    foreach ($keys as $k) {
        $result[] = $arr[$k];
    }
    
    print_r($result);
    

    更新

    从快速基准测试来看,array_rand() 似乎比使用 shuffle() 处理更大的数组快得多。基准测试是在具有 14336 元素的数组上完成的,每个元素都有 10000 迭代。

    在我的开发机上得到的结果如下:

    • 数组中的元素数 - 14336
    • 每种方法的迭代次数 - 10000
    • array_rand() 版本耗时 4.659 秒
    • shuffle() 版本耗时 15.071 秒

    用于基准测试的代码可以在this gist找到。

    【讨论】:

      【解决方案2】:

      无需循环!

      shuffle()array_slice() 完成这项工作。

      只需 shuffle 您的数组以重新排列条目,现在使用 array_slice 选择第一个 4 项目。


      shuffle($arr);
      print_r(array_slice($arr,0,4));
      

      Demo

      【讨论】:

      • shuffle() 的问题在于它会破坏您的数组键(但在这种情况下不是)。还应注意,如果您请求多个随机条目,array_rand()不会返回重复元素,而 shuffle() 会。这是一个有效的解决方案,但我个人会坚持使用array_rand() :)
      • @AmalMurali: array_slice() 在这种情况下给出了前 4 个元素,它们怎么可能是重复的?
      • @AbraCadaver:如果数组值是随机顺序的,那么它有可能会。
      • @AmalMurali,你能提供一些shuffle 在这种情况下失败的测试用例吗?
      • @ShankarDamodaran:我没有说它会失败。我说它有可能返回重复的元素。从快速基准测试来看,array_rand() 在处理更大的数组时速度明显更快。
      【解决方案3】:

      了解$num参数array_rand()

      print_r(array_rand($arr, 4));
      

      全部显示:

      foreach(array_rand($arr, 4) as $key) {
          echo $arr[$key]['text'] ."\n";
          //etc
      }
      

      【讨论】:

      • 这给了我Array ( [0] =&gt; 1 [1] =&gt; 4 [2] =&gt; 5 [3] =&gt; 11 我将如何使用它来打印我的数组值
      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多