1

我有一个包含 200 多个项目的大型 JSON 文件。里面有5组数据。每个组至少有 30 个项目。我使用 来区分它们"p" tag,就像"p":"1","p":"2","p":"3","p":"4","p":"5"在 json 数据中一样。现在我想从每组中获得 2 件物品,总共 10 件物品,随机订单。

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

现在如何从随机订单中获取 2 件商品"p":"1"和 2 件商品?"p":"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;  
          }
      }
}

我需要得到如下结果:

orange ("p":"1") Carrot ("p":"2") pear ("p":"1") Lettuce ("p":"2")

Lettuce ("p":"2") banana ("p":"1") Apple ("p":"1") Chauli ("p":"2")

总之,获得 2 个蔬菜和 2 个水果的混合订单。谢谢。

4

2 回答 2

6
$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);
于 2012-08-27T17:20:26.990 回答
3
  • 重新排列数据,使您的数组看起来像

    1=>array(苹果、橙子、梨、...), 2=>array(Chauli, Carrot, Potato), 3=>...

  • 通过 array_rand 从每个数组中选择 2 个元素

  • 将这两个元素附加到一个输出数组
  • 随机播放该临时数组
于 2012-08-27T14:52:34.533 回答