在保持索引关联的同时从数组中查找所有可能的总和

Find all possible sums from array while maintaining index association

我正在处理一些提供付款方式的数据,这些付款方式被接受为它们的数值总和。付款方式为:

2 Visa
4 Mastercard
8 American Express
16 Discover
32 Diners
64 Cash
128 Check
256 Debit

因此,如果接受 Visa 和 Mastercard,则值为 6。如果接受 Visa、Mastercard 和 Discover,则值为 22。

我认为解决这个问题的一种方法是提出所有可能总和的数组,其中总和是索引,用于构成该总和的支付方式是该索引的数组。例如:

$methods = array(
    2 => array(
        2 => 'Visa'
    ),
    4 => array(
        4 => 'Mastercard'
    ),
    6 => array(
        2 => 'Visa',
        4 => 'Mastercard'
    ),
    8 => array(
        8 => 'American Express'
    ),
    10 => array(
        2 => 'Visa',
        8 => 'American Express'
    )
);

等等,并将其放入要包含的文件中,这样我所要做的就是指定 $methods[10] 并获取 Visa 和 Amex 的数组。

我的另一部分认为可以将支付方式本身放入一个数组中,并且可以使用一个公式来进行动态计算。如果可能的话,我更喜欢这种方式,但我无法弄清楚。一个简单的:

$methods = paymentMethods(10);

我如何解决只有一笔金额可以计算的问题,以及如何确定用于创建该金额的值(付款方式)?

这个应该可以吧,我没时间自己测试,有什么问题欢迎评论(这里$cards是支付方式数组开头的你的问题)。

<?php

function methods($n) {
    global $cards;
    $k = closest_to($n);
    $r = $n - $k;
    if ($r != 0) {
        return array($k => $cards[$k]) + methods($r);
    } else {
        return array($k => $cards[$k]);
    }
}

function closest_to($n) {
    global $cards;
    $prevK = null;
    foreach ($cards as $k => $v) {
        if ($k > $n) {
            return $prevK;
        }
        $prevK = $k;
    }
    end($cards);
    return key($cards);
}