php随条件洗牌
我有一个包含200多个项目的大型JSON文件。其中有5组数据。每组至少有30个项目。我使用json数据中的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
“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);