如何在foreach中按父数组分组

时间:2020-05-07 11:08:29

标签: php json foreach

我如何获得此结果。我想按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中获得这种结果? 谢谢

2 个答案:

答案 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)

可以用多种方法编写脚本,但是一些要点是:

  • 当可以在外循环中只执行一次时,不要要求php在内循环中执行相同的计算。
  • 我希望将处理过程和显示代码部分尽可能地分开,这样就可以收集内循环的数据,将其粘贴并推入外循环的collections数组中,然后在完成迭代后,将收集的数据粘合在一起。这样还可以防止任何尾随/悬挂的标记(<br>)标签。
  • 您可以忽略嵌套循环中的if条件,并且其中一个循环可以完全删除。使用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]=======
相关问题