1

200 を超えるアイテムを含む大きな JSON ファイルがあります。その中には5つのグループデータがあります。各グループには少なくとも 30 個のアイテムがあります。json データの"p" tagように、を使用してそれらを区別します。"p":"1","p":"2","p":"3","p":"4","p":"5"今、私は各グループから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(チャウリ、ニンジン、ポテト)、3=>...

  • array_rand を介して各配列から 2 つの要素を選択します

  • これらの 2 つの要素を 1 つの出力配列に追加する
  • その一時配列をシャッフルする
于 2012-08-27T14:52:34.533 に答える