Can this PHP code to settle up payments be improved?
Well if you want to split hairs, you could do a couple of minor changes (commented below)

Honestly, I can't see any advantage in making it recursive, it works fine as it is

function settleUp($owings){
    $reimbursments = array();

// $i is never used
 //   $payment = 0.11; $i = 1;

// by using a do/while loop you don't need to assign $payment to a random value to being the loop
    do {
        $min = 0;
        $max = 0;
        foreach ($owings as $id =&gt; $owing){
            if ($owing &lt; $min) {
                $min = $owing;
                $min_id = $id;
            }
            if ($owing &gt; $max) {
                $max = $owing;
                $max_id = $id;
            }
        }
        $payment = -$min &gt; $max ? -$max : $min;

        if ($payment !== 0) {
            $reimbursments[] = array(
                'from'      =&gt; $max_id,
                'to'        =&gt; $min_id,
                'payment'   =&gt; -$payment,
            );

            $owings[$max_id] += $payment;
            $owings[$min_id] -= $payment;
        }
  //      $i++;
    } while ( $payment &gt; 0.1 || $payment &lt; -0.1 );

    return $reimbursments;
}