Найти все возможные суммы из массива, поддерживая связь индекса

Я работаю с некоторыми данными, которые предоставляют способы оплаты, принятые в виде суммы их числовых значений. Способы оплаты:

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'
)
);

И так далее, и поместите это в файл для включения, так что все, что мне нужно сделать, это указать $ method [10] и получить массив Visa и Amex.

Другая часть меня думает, что сами способы оплаты могут быть помещены в массив, и формула может быть использована для расчета на лету. Я бы предпочел этот путь, если это возможно, но я не могу понять это. Просто:

$methods = paymentMethods(10);

Как мне решить проблему наличия только суммы для работы и определения того, какие значения (способы оплаты) были использованы для создания этой суммы?

-1

Решение

Это должно работать примерно, у меня нет времени, чтобы проверить это самостоятельно, не стесняйтесь комментировать, если есть проблема (здесь $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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector