Php 如何在foreach中按父数组分组
我怎样才能达到这个结果。我想按b_id对数据进行分组,因此这是我的尝试 但我无法理解,它一直显示一个解组数据。 下面我列出了我想要的和不想要的代码和结果 测试数据Php 如何在foreach中按父数组分组,php,json,foreach,Php,Json,Foreach,我怎样才能达到这个结果。我想按b_id对数据进行分组,因此这是我的尝试 但我无法理解,它一直显示一个解组数据。 下面我列出了我想要的和不想要的代码和结果 测试数据 $d = "[ { \"b_id\": 1, \"d\": 0, \"lo\": 10, \"m\": 4000, \"pts\": [ { \"amount\":
$d = "[
{
\"b_id\": 1,
\"d\": 0,
\"lo\": 10,
\"m\": 4000,
\"pts\": [
{
\"amount\": 3500,
\"b_id\": 1,
\"fid\": 2,
\"side\": 2,
\"user_id\": 27
},
{
\"amount\": 3000,
\"b_id\": 1,
\"fid\": 2,
\"side\": 1,
\"user_id\": 27
},
{
\"amount\": 2000,
\"b_id\": 1,
\"fid\": 2,
\"side\": 2,
\"user_id\": 20
},
{
\"amount\": 1000,
\"b_id\": 1,
\"fid\": 2,
\"side\": 1,
\"user_id\": 20
}
],
\"ro\": 10,
\"side\": 2,
\"user_id\": 27,
\"w\": 5000
},
{
\"b_id\": 2,
\"d\": 0,
\"lo\": 10,
\"m\": 6000,
\"pts\": [
{
\"amount\": 4000,
\"b_id\": 2,
\"fid\": 2,
\"side\": 1,
\"user_id\": 27
},
{
\"amount\": 2000,
\"b_id\": 2,
\"fid\": 2,
\"side\": 2,
\"user_id\": 27
},
{
\"amount\": 1000,
\"b_id\": 2,
\"fid\": 2,
\"side\": 2,
\"user_id\": 20
},
{
\"amount\": 2000,
\"b_id\": 2,
\"fid\": 2,
\"side\": 1,
\"user_id\": 20
}
],
\"ro\": 9,
\"side\": 1,
\"user_id\": 27,
\"w\": 3000
}
]";
代码
但是我想要这个结果
======[START (b_id: 1]======
Odds: 4000
Ret: 0
Amount: 3500
Odds: 4000
Ret: 2500
Amount: 500
Odds: 4000
Ret: 2000
Amount: 0
Odds: 4000
Ret: 1000
Amount: 0
=======[END (b_id: 1]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 4000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
Odds: 5400
Ret: 1000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
=======[END (b_id: 2]=======
在foreach中有可能实现这种结果吗?
谢谢分组是可能的,只需要对代码做一点小的更改 请注意,开始行和结束行的打印移到了foreach之外,刚好移到“if($a==“pts”){”中,并且在金额行的打印中添加了一个额外的“
”
if($a == "pts") {
echo "======[START (b_id: ".$row->b_id."]======<br>";
foreach($b as $col => $val) {
$odds = getOdds($row->m,$row->lo,$row->ro);
$ret = getMax($val->amount,$odds);
$amount = round(abs($val->amount - $ret),2);
echo "Odds: $odds<br>";
echo "Ret: $ret<br>";
echo "Amount: $amount <br><br>";
}
echo "=======[END (b_id: ".$row->b_id."]=======<br><br>";
}
if($a==“pts”){
echo“==========[开始(b_id:.$row->b_id.]=======
”;
foreach($b为$col=>$val){
$ROBs=GetObst($row->m,$row->lo,$row->ro);
$ret=getMax($val->金额,$COUNT);
$amount=四舍五入(abs$val->amount-$ret),2);
回声“赔率:$赔率
”;
回声“Ret:$Ret
”;
回显“金额:$Amount
”;
}
echo“==========[结束(b_-id:.$row->b_-id.]=======
”;
}
这可以通过多种方式编写脚本,但有些要点是:
- 不要要求php在内部循环中执行相同的计算,因为它只能在外部循环中执行一次
- 我喜欢尽可能地将处理和显示代码组件分开,以便收集内部循环的数据,并将其粘贴到外部循环的集合数组中,然后在完成迭代后,将集合数据粘合在一起。这还可以防止任何拖尾/悬空标记(
) - 您可以忽略嵌套循环中的if条件,并且可以完全删除其中一个循环。使用
隔离array\u column()
数据,因为这是您实际使用的唯一数据$amount
- 当可以将给定值作为参数传递给函数时,不要使用
声明global
您想要实现的称为控制中断。
======[START (b_id: 1]======
Odds: 4000
Ret: 0
Amount: 3500
Odds: 4000
Ret: 2500
Amount: 500
Odds: 4000
Ret: 2000
Amount: 0
Odds: 4000
Ret: 1000
Amount: 0
=======[END (b_id: 1]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 4000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
Odds: 5400
Ret: 1000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
=======[END (b_id: 2]=======
if($a == "pts") {
echo "======[START (b_id: ".$row->b_id."]======<br>";
foreach($b as $col => $val) {
$odds = getOdds($row->m,$row->lo,$row->ro);
$ret = getMax($val->amount,$odds);
$amount = round(abs($val->amount - $ret),2);
echo "Odds: $odds<br>";
echo "Ret: $ret<br>";
echo "Amount: $amount <br><br>";
}
echo "=======[END (b_id: ".$row->b_id."]=======<br><br>";
}
$break = "\n"; // <br>
$break2 = "\n\n"; // <br><br>
$collections = [];
foreach($d as $row) {
$odds = getOdds($row->m, $row->lo, $row->ro);
$collection = [];
foreach(array_column($row->pts, 'amount') as $amount) {
$ret = getMax($row->m, $amount, $odds); // I am assuming that $row-m is supposed to be $bets
$amount = round(abs($amount - $ret), 2);
$collection[] = implode($break, ["Odds: {$odds}", "Ret: {$ret}", "Amount: {$amount}"]);
}
$collections[] = implode($break, [
"======[START (b_id: {$row->b_id}]======",
implode($break2, $collection),
"=======[END (b_id: {$row->b_id}]=======",
]);
}
echo implode($break2, $collections);
======[START (b_id: 1]======
Odds: 4000
Ret: 3500
Amount: 0
Odds: 4000
Ret: 3000
Amount: 0
Odds: 4000
Ret: 2000
Amount: 0
Odds: 4000
Ret: 1000
Amount: 0
=======[END (b_id: 1]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 4000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
Odds: 5400
Ret: 1000
Amount: 0
Odds: 5400
Ret: 2000
Amount: 0
=======[END (b_id: 2]=======