【问题标题】:how to grab a "random" set of items from a loop in php如何从php中的循环中获取“随机”一组项目
【发布时间】:2010-01-04 08:45:41
【问题描述】:

我正在循环一些 XML 节点,并说我有 1 到 200 个这些节点。

我如何“随机”选择最多 10 个这些节点。它必须最多十个,但最少为 1 个。

这就是我现在正在使用的...

        $i = 0;
        foreach ($butters->users->user as $user) {
            if($i==10) break;
            $id = $user->id;
            $name = $user->screen_name;
            $profimg = $user->profile_image_url;
            echo "things";
            $i++;
        } 

困难在于我不知道我将拥有多少个,但我希望我从中选择“随机”10 的池来自所有存在的池。

【问题讨论】:

    标签: php


    【解决方案1】:
    $randomPool = array_rand ( $butters->users->user, 10 );
    

    【讨论】:

    • 我认为这行不通,这取决于他使用的 XML 模块,因为 array_rand 需要数组作为第一项,但是 $butters->users->user 可能是 DOMNODE::ELEMENT_LIST 如果您正在使用 DOM 模块。虽然可能是错误的
    • 假设 Patrick 给出的示例没有输出错误,适用于 foreach 的方法也适用于 array_rand()。
    • 听起来好像帕特里克想要 10 作为随机元素的上限,所以你应该为 array_rand 的第二个参数传递一个 1 到 10 之间的随机数,然后你会得到一组随机长度在 1 到 10 之间的节点
    【解决方案2】:

    我会得到 10 个随机索引,然后遍历这些索引并获取节点。

    $indexes = 数组(); for($i = 0; $iusers->length); } foreach($indexes 作为 $index){ $user = $butters->users->item($index); // 用 $user 做任何事情 }

    您需要添加检查以确保在将索引添加到 $indexes 数组时尚未获得该索引。

    您可以将其放入一个命令中,但最终可能会出现重复项(不太可能取决于元素的数量,但可能...

    for($i = 0; $iusers->item(rand(0, $butters->users->length)); //用$user做一些事情 }

    【讨论】:

      【解决方案3】:

      将所有用户放入一个数组,打乱并抓取前十项:

      $users = array[];
      foreach ($butters->users->user as $user) {
          $users[] = &$user;
      }
      shuffle($users);
      $tenRandomUsers = array_slice($users, 0, 10);
      

      也许你可以用$users = (array) $butters->users->user缩短第一步。

      【讨论】:

        【解决方案4】:

        创建一个随机对象(不知道 PHP 特定代码)然后调用它并与 10 /(集合中的总数)进行比较。这意味着您理论上应该选择 10%,但它可能会更少,并且您的现有代码会阻止它选择更多。

        【讨论】:

          【解决方案5】:

          假设您使用的是 SimpleXML,您可以使用XPath 来获取所有用户。这将返回一个数组,它应该是蛋糕。

          应该这样做:

          $users  = $xml->xpath('//butters/users/user');
          $random = array_rand($users, 10);
          

          不过,有人可能想在 Xpath 上纠正我。凭记忆做到这一点

          【讨论】:

            【解决方案6】:

            如果您有某种奇怪的自我实现的 $users 数据结构,您可能想要使用储层采样 -- Efficiently selecting a set of random elements from a linked list

            【讨论】:

              猜你喜欢
              • 2013-04-28
              • 2015-10-30
              • 2017-02-10
              • 2011-06-30
              • 1970-01-01
              • 2021-06-30
              • 1970-01-01
              • 2020-10-15
              • 1970-01-01
              相关资源
              最近更新 更多