Php 如何在foreach中按父数组分组

Php 如何在foreach中按父数组分组,php,json,foreach,Php,Json,Foreach,我怎样才能达到这个结果。我想按b_id对数据进行分组,因此这是我的尝试 但我无法理解,它一直显示一个解组数据。 下面我列出了我想要的和不想要的代码和结果 测试数据 $d = "[ { \"b_id\": 1, \"d\": 0, \"lo\": 10, \"m\": 4000, \"pts\": [ { \"amount\":

我怎样才能达到这个结果。我想按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
       }
    ]";
代码

但是我想要这个结果

       ======[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]=======