php随条件洗牌

php随条件洗牌,php,arrays,shuffle,Php,Arrays,Shuffle,我有一个包含200多个项目的大型JSON文件。其中有5组数据。每组至少有30个项目。我使用json数据中的“p”标记来区分它们,比如“p”:“1”、“p”:“2”、“p”:“3”、“p”:“4”、“p”:“5”。现在我想从每组中得到2件物品,总共10件物品,随机排列 为了便于解释,我设置了一些简单的数据,如下所示。“p”:“1”在其组中有4项,“p”:“2”在其组中有4项 现在,如何使用随机顺序从“p”:“1”获取2个项目,以及使用“p”:“2”获取2个项目 $json = <<&l

我有一个包含200多个项目的大型JSON文件。其中有5组数据。每组至少有30个项目。我使用json数据中的
“p”标记来区分它们,比如
“p”:“1”、“p”:“2”、“p”:“3”、“p”:“4”、“p”:“5”
。现在我想从每组中得到2件物品,总共10件物品,随机排列

为了便于解释,我设置了一些简单的数据,如下所示。“p”:“1”在其组中有4项,“p”:“2”在其组中有4项

现在,如何使用随机顺序从
“p”:“1”
获取2个项目,以及使用
“p”:“2”
获取2个项目

$json = <<<ETO
[
   {
      "a":"apple",
      "p":"1"
   },
   {
      "a":"orange",
      "p":"1"
   },
   {
      "a":"pear",
      "p":"1"
   },
   {
      "a":"banana",
      "p":"1"
   },
   {
      "a":"Chauli",
      "p":"2"
   },
   {
      "a":"Carrot",
      "p":"2"
   },
   {
      "a":"Lettuce",
      "p":"2"
   },
   {
      "a":"Potato",
      "p":"2"
   }
]
ETO;

$data = json_decode($json);
shuffle($data);// some shuffle like this is very ugly...
foreach($data as $row){                         
      $aoo = 1;
      $boo = 1;
      if($row->p==1){
          echo $row->p.': '.$row->a.'<br />';
          $aoo++;
          if($aoo==2){
            break;  
          }
      }
      if($row->p==2){
          echo $row->p.': '.$row->b.'<br />';
          $boo++;
          if($boo==2){
            break;  
          }
      }
}
$json=a.“
”; $aoo++; 如果($aoo==2){ 打破 } } 如果($row->p==2){ 回声$row->p.:'.$row->b.。
; $boo++; 如果($boo==2){ 打破 } } }
我需要得到如下结果:

orange(“p”:“1”)胡萝卜(“p”:“2”)梨(“p”:“1”)莴苣(“p”:“2”)

莴苣(“p”:“2”)香蕉(“p”:“1”)苹果(“p”:“1”)乔利(“p”:“2”)

一句话,得到两种蔬菜和两种水果混合的订单。谢谢。

  • 重新排列数据,使数组看起来像

    1=>阵列(苹果、橘子、梨等), 2=>数组(Chauli、胡萝卜、土豆), 3=>

  • 通过array_rand从每个数组中拾取2个元素

  • 将这两个元素附加到一个输出数组中
  • 洗牌那个临时数组
      • 重新排列数据,使数组看起来像

        1=>阵列(苹果、橘子、梨等), 2=>数组(Chauli、胡萝卜、土豆), 3=>

      • 通过array_rand从每个数组中拾取2个元素

      • 将这两个元素附加到一个输出数组中
      • 洗牌那个临时数组

      将项目分为单独的组。从每组中随机抽取两个项目,将它们全部放入一个数组中。洗牌数组。将项目分成单独的组。从每组中随机抽取两个项目,将它们全部放入一个数组中。洗牌阵法。我得承认我在找一些很难的东西,当它这么容易的时候!有没有理由不说foreach(array_rand($group,2)作为$key){$selected[]=$group[$key];}
-不管怎样,你都有它们;它们只是隐藏在所有阵列魔法中。:)顺便说一下,这比一个简单的
foreach
循环要困难得多。我得承认,我一直在寻找一些困难的东西,当它这么简单的时候!有没有理由不说foreach(array_rand($group,2)作为$key){$selected[]=$group[$key];}-不管怎样,你都有它们;它们只是隐藏在所有阵列魔法中。:)顺便说一句,这比一个简单的
foreach
循环要困难得多。
$values = json_decode($json, true);

$grouped = array();
foreach ($values as $value) {
    $grouped[$value['p']][] = $value;
}

$chosen = array();
foreach ($grouped as $group) {
    $keys = array_rand($group, 2);
    $chosen = array_merge($chosen, array_intersect_key($group, array_flip($keys)));
}

shuffle($chosen);