我如何获得此结果。我想按b_id分组数据,所以这是我的尝试 但我无法弄清楚它反而一直显示取消分组的数据。 在下面,我列出了我想要和不想要的代码以及结果。
测试数据
$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
}
]";
代码
$d = json_decode($d);
foreach($d as $data => $row) {
foreach($row as $a => $b) {
if($a == "pts") {
foreach($b as $col => $val) {
echo "======[START (b_id: ".$row->b_id."]======<br>";
$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>";
echo "=======[END (b_id: ".$row->b_id."]=======<br><br>";
}
}
}
}
function getOdds($bets,$a,$b) {
return ($bets * $b) / $a;
}
function getMax($bet, $max) {
global $bets;
$ret = 0;
if($bets < $max) {
$bets += $bet;
$ret = ($bets % $max);
if($ret == $bets)
$ret = 0;
} else
$ret = $bet;
return $ret;
}
结果
======[START (b_id: 1]======
Odds: 4000
Ret: 0
Amount: 3500
=======[END (b_id: 1]=======
======[START (b_id: 1]======
Odds: 4000
Ret: 2500
Amount: 500
=======[END (b_id: 1]=======
======[START (b_id: 1]======
Odds: 4000
Ret: 2000
Amount: 0
=======[END (b_id: 1]=======
======[START (b_id: 1]======
Odds: 4000
Ret: 1000
Amount: 0
=======[END (b_id: 1]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 4000
Amount: 0
=======[END (b_id: 2]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 2000
Amount: 0
=======[END (b_id: 2]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 1000
Amount: 0
=======[END (b_id: 2]=======
======[START (b_id: 2]======
Odds: 5400
Ret: 2000
Amount: 0
=======[END (b_id: 2]=======
但是我想要这个结果
======[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中获得这种结果? 谢谢
答案 0 :(得分:1)
可以分组,只需要对代码进行少量更改即可。
请注意,START和END行的打印移到了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>";
}
答案 1 :(得分:0)
可以用多种方法编写脚本,但是一些要点是:
<br>
)标签。array_column()
隔离$amount
数据,因为那是您实际使用的唯一数据。global
声明。代码:(Demo)
$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]=======