PHP数组:具有多个数组的数学运算

PHP数组:具有多个数组的数学运算,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我这里有一个逻辑问题,我应该如何在PHP中执行它,非常感谢您的支持 我有两个阵列: 发票 付款 数组看起来像这样 $invoice = array ( array("id"=>1,"amt"=>2000.00), array("id"=>2,"amt"=>3000.00), array("id"=>3,"amt"=>4000.00) ); $payments = array ( array("id"=>11111,"a

我这里有一个逻辑问题,我应该如何在PHP中执行它,非常感谢您的支持 我有两个阵列:

  • 发票
  • 付款
  • 数组看起来像这样

    $invoice = array
    (
        array("id"=>1,"amt"=>2000.00),
        array("id"=>2,"amt"=>3000.00),
        array("id"=>3,"amt"=>4000.00)
    );
    
    
    $payments = array
    (
        array("id"=>11111,"amt"=>500.00),
        array("id"=>22222,"amt"=>3000.00),
        array("id"=>33333,"amt"=>4500.00),
        array("id"=>44444,"amt"=>1500.00)
    );
    
    更新 这是我写的代码

        // count how many elements available
    $sc = count($iSetl);
    $ic = count($payments);
    
    /*
        Three types of flags
        $flag = 0   //  first execution
        $flag = 1   //  settlement amount is higher than the payment amount
        $flag = 2   //  payment amount is higher than the settlement amount
    
    */
    
    // available balances after transaction
    $setBal = 0;   // settlement balance
    $paymBal = 0;   // payment balance
    $flag = 0;
    
    // our priority is to disburse all payments
    // therefore our initial loop would be payments
    foreach($payments as $p){
    
        // round 2:
        // settlement value is higher there for we are approaching to the next invoice
        if($flag == 1){
            if($setBal > 0){
                if($setData <= $p["amt"]){
                    $setData = $p["amt"] - $setData;
                    //echo($setData)."<br />";
                    $output = "invoice number #".$s["id"]." | invoice value ".$s["amt"]." Payment Number " . $p["id"] . " - Payment Amount ". $p["amt"]."<br />";
                    $output .= "after settlement the invoice value is ". $setData;
                    echo($output);
                    echo "<br />the payment value is more than the invoice settlement <br /><br />";
                    $setBal = $setData;
                    $flag = 2;
                }
            }
        }
    
        // start looping each settlements
        foreach($iSetl as $s){
    
            // check if this is the initial transaction
            if($flag == 0 ){
    
                // if the settlement balance is equal to 0 (or less)
                // or settlement is complete
                if($setBal <= 0) {
    
                    // this case: Settlement amount is more than the payment amount therefore
                    // deduct the settlement from payment
                    $setData = $p["amt"];
                    $setData = $s["amt"] - $setData;
    
                    $output = "invoice number #".$s["id"]." | invoice value ".$s["amt"]." Payment Number " . $p["id"] . " - Payment Amount ". $p["amt"]."<br />";
                    $output .= "after settlement the invoice value is ". $setData;
                    echo($output);
                    //echo($setData)."<br />";
                    echo "<br />the invoice settlement value is more than the payment value<br /><br />";
    
                    // assign the balance amount to be settled
                    $setBal = $setData;
    
                    // set the flag as 1 since the settlement value is higher than payment value
                    $flag = 1;
                }
            }
    
            if($flag == 2 ){
                // if the settlement balance is equal to 0 (or less)
                // or settlement is complete
                if($setBal > 0) {
                    echo("stage3 <br />");
                    // this case: Settlement amount is more than the payment amount therefore
                    // deduct the settlement from payment
                    $setData = $s["amt"] - $setData;
    
                    //echo($setData)."<br />";
                    $output = "invoice number #".$s["id"]." | invoice value ".$s["amt"]." Payment Number " . $p["id"] . " - Payment Amount ". $p["amt"]."<br />";
                    $output .= "after settlement the invoice value is ". $setData;
                    echo($output);
                    echo "<br />the invoice settlement value is more than the payment value<br /><br />";
    
                    // assign the balance amount to be settled
                    $setBal = $setData;
    
                    // set the flag as 1 since the settlement value is higher than payment value
                    $flag = 1;
                }
            }
        }
    }
    
    //计算有多少元素可用
    $sc=计数($iSetl);
    $ic=计数($payments);
    /*
    三种旗帜
    $flag=0//第一次执行
    $flag=1//结算金额高于支付金额
    $flag=2//付款金额高于结算金额
    */
    //交易后可用余额
    $setBal=0;//结算余额
    $paymBal=0;//付款余额
    $flag=0;
    //我们的首要任务是支付所有款项
    //因此,我们的初始循环是支付
    foreach(按$p付款){
    //第二轮:
    //那里的结算价值更高,因为我们正在接近下一张发票
    如果($flag==1){
    如果($setBal>0){
    如果($setData 0){
    回声(“阶段3
    ”); //这种情况:因此结算金额大于付款金额 //从付款中扣除结算 $setData=$s[“金额”]-$setData; //echo($setData)。“
    ”; $output=“发票编号”#“$s[“id”]。”发票价值“$s[“amt”]。”付款编号“$p[“id”]。”-付款金额“$p[“amt”]。”
    ”; $output.=“结算后发票值为”$setData; 回波(输出); echo“
    发票结算值大于付款值

    ”; //分配要结算的余额 $setBal=$setData; //由于结算值高于付款值,因此将标志设置为1 $flag=1; } } } }
    当发票“金额”高于付款“金额”金额时,我想用付款“金额”结算发票“金额”,而在其他情况下,付款高于发票金额

    结果应该显示为


    非常困惑如何处理此问题,请提供帮助。

    如果需要对其进行排序,可以使用数组合并创建一个数组,并对该数组进行排序

    这是php排序方法:

    http://php.net/manual/en/function.usort.php
    

    您需要在回调函数中添加列以进行比较

    但是,如果这些数据来自数据库,请尝试从子查询并按列排序


    等等。。。按“ASC”排序

    您能解释一下创建表时应用的逻辑吗?因为我无法理解逻辑。那么只有任何一个人能够回答我更新了我写的脚本。请告知,我打算做的是,根据相应阵列中的可用付款结算所有发票。有时发票无法完全结算(付款),在这种情况下,我需要从付款中找到下一个可用的数组元素。当已结算的付款在我希望结算下一个发票数组元素的位置剩余时,也会发生同样的情况。我显示的表是我期望从上面提到的两个数组得到的结果。希望这是清楚的。我的问题不是排序,我需要根据付款数组中的付款与发票结算发票。
    http://php.net/manual/en/function.array-multisort.php