数组中的PHP计算(递归?)

时间:2011-12-07 16:21:14

标签: php

我正在尝试编写一个函数来计算每个订单的总价格,当给定产品的价格和该用户拥有的信用时。应扣除信用额度,如果有任何遗漏,则应从下一个订单中扣除。

该功能应返回每个订单的最终价格以及以一个数组中的每个帐户保留的信用额,并将客户ID作为键。任何负数(信用或订单价格)都应设为0。

'abc'和'def'是客户ID。此示例代码应该更好地解释事情。 我需要一个递归函数吗?

输入:

//should return: order 1 = 375, order 2 = 90, remaining credit = 0;
$order['abc'][1] = 500;
$order['abc'][2] = 90;
$credit['abc'] = 125;

//should return: order 1: 0, order 2: 0, remaining credit = 125
$order['def'][1] = 100;
$order['def'][2] = 75;
$credits['def'] = 300;

返回应该是一个单独的数组,如下:

$set['abc'][1] = 375;
$set['abc'][2] = 90;
$set['abc']['credit_remaining'] = 0;
$set['def'][1] = 0;
$set['def'][2] = 0;
$set['def']['credit_remaining'] = 125;

3 个答案:

答案 0 :(得分:0)

不需要递归。这应该有效:

function someFunction( $order, $credit ) {
    $set = NULL;
    $keys = array_keys( $order );
    foreach ( $keys as $key ) {
        $set[$key]['credit_remaining'] = $credit[$key];

        // assuming that the orders are numerically contiguous
        for ( $counter = 1; $counter < count( $order[$key] ); $counter++ ) {
            if ( $order[$key][$counter] < $set[$key]['credit_remaining'] ) {
                // then the order is less than the credit
                $set[$key]['credit_remaining'] -= $order[$key][$counter];
                $set[$key][$counter] = 0;
            } else {
                // not enough credit to cover this order
                $set[$key][$counter] -= $set[$key]['credit_remaining'];
                $set[$key]['credit_remaining'] = 0;
            }
        }
    }

    return $set;
}

答案 1 :(得分:0)

    //should return: order 1 = 375, order 2 = 90, remaining credit = 0;
    $order['abc'][1] = 375; // assuming you meant 375 per your comment above
    $order['abc'][2] = 90;
    $credits['abc'] = 125; // assuming you meant $credits in the posted code

    //should return: order 1: 0, order 2: 0, remaining credit = 125
    $order['def'][1] = 100;
    $order['def'][2] = 75;
    $credits['def'] = 300;


    $set = array();
    foreach($order as $key=>$value){
            foreach($value as $single_order){
                    $set[$key][] = $single_order;
                    !isset($set[$key]['credit_remaining']) ? $set[$key]['credit_remaining'] = max(0,$credits[$key] - $single_order) : $set[$key]['credit_remaining'] = max(0,$set[$key]['credit_remaining'] - $single_order);
            }
            ksort($set[$key],SORT_STRING); // sort the array so the credits are last
    }

    print_r($set);

    /*
    Array
    (
        [abc] => Array
            (
                [0] => 375
                [1] => 90
                [credit_remaining] => 0
            )

        [def] => Array
            (
                [0] => 100
                [1] => 75
                [credit_remaining] => 125
            )

    )
    */

答案 2 :(得分:0)

不需要递归,为什么不尝试这样的事情?

$newArray = array();

foreach ($order as $customer => $value) 
{
    $newArray[$customer]['credit_remaining'] = $credit[$customer];

    foreach ($order[$customer] as $order_num => $cost) 
    {
        //Order is more than credit
        if($newArray[$customer]['credit_remaining'] - $order[$customer][order_num] <= 0)
        {
            $newArray[$customer][$order_num] = $order[$customer][$order_num] - newArray[$customer]['credit_remaining'];
            $newArray[$customer]['credit_remaining'] = 0;
        }

        //Otherwise
        else
        {
            $newArray[$customer]['credit_remaining'] -= $order[$customer][$order_num];
            $newArray[$customer][$order_num] = 0;
        }
    }
}