先了解下PHP手册

(PHP 4, PHP 5, PHP 7)
foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。

还能够自定义遍历对象。

Note:
当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。
由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。

当我们在foreach中要修改数组时,可以引用赋值而不是拷贝一个值。

『 前提:被 foreach 遍历的数组可以被引用 』

Warning:
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

下面我们根据以上的思路来完成一道题。

eg. 现在要对借款记录 loanArray 来还款,还款数组为 refundArray,求2个数组间的还款关系

// 还款明细
$refundArray = [
    ['id' => 11, 'money' => 100],
    ['id' => 22, 'money' => 300],
    ['id' => 33, 'money' => 200]
];

// 借款明细
$loanArray = [
    ['id' => 1, 'money' => 300],
    ['id' => 2, 'money' => 200],
    ['id' => 3, 'money' => 100]
];

// 还款记录
$logs = [];
$num  = 1;
foreach ($refundArray as &$refund) {
    $num++;
    foreach ($loanArray as &$loan) {
        if ($loan['money'] === 0) {
            continue;
        }
        if ($refund['money'] === 0) {
            continue;
        }

        if ($refund['money'] >= $loan['money']) {
            $usedMoney       = $loan['money'];
            $refund['money'] -= $loan['money'];
            $loan['money']   = 0;
        } else {
            $usedMoney       = $refund['money'];
            $loan['money']   -= $refund['money'];
            $refund['money'] = 0;
        }

        $logs[] = [
            'refund_id'  => $refund['id'],
            'loan_id'    => $loan['id'],
            'used_money' => $usedMoney,
        ];
    }
}
// 尽量清空
unset($refund);
unset($loan);
print_r($logs);

// 输出结果
Array
(
    [0] => Array
        (
            [refund_id] => 11
            [loan_id] => 1
            [used_money] => 100
        )

    [1] => Array
        (
            [refund_id] => 22
            [loan_id] => 1
            [used_money] => 200
        )

    [2] => Array
        (
            [refund_id] => 22
            [loan_id] => 2
            [used_money] => 100
        )

    [3] => Array
        (
            [refund_id] => 33
            [loan_id] => 2
            [used_money] => 100
        )

    [4] => Array
        (
            [refund_id] => 33
            [loan_id] => 3
            [used_money] => 100
        )
)