Я работаю с некоторыми данными, которые предоставляют способы оплаты, принятые в виде суммы их числовых значений. Способы оплаты:
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);
Как мне решить проблему наличия только суммы для работы и определения того, какие значения (способы оплаты) были использованы для создания этой суммы?
Это должно работать примерно, у меня нет времени, чтобы проверить это самостоятельно, не стесняйтесь комментировать, если есть проблема (здесь $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);
}
Других решений пока нет …