php shuffle有条件

时间:2012-08-27 14:46:29

标签: php arrays shuffle

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

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

现在如何使用随机订单从"p":"1""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;  
          }
      }
}

我需要得到如下结果:

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种水果混合订单。感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

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

    1 =&gt;阵列(苹果,橙子,梨子......), 2 =&gt;阵列(Chauli,Carrot,Potato), 3 =&GT; ...

  • 通过array_rand

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