如何根据数组键拆分整数,然后根据我如何拆分该整数添加值

时间:2021-02-23 15:28:17

标签: php arrays

我有数组 $money ,其中键是钱的价值,但数组键是 - 有多少这种类型的钱。 这是示例:

  $money = [
    1 => 5,
    2 => 2,
    5 => 1,
    10 => 4,
    20 => 2,
    50 => 3,
    100 => 1,
    200 => 1
];

其中 1 = 0.1EUR,2 = 0.2EUR,直到 200,其中 200 = 2EUR。关键值是 - 我有多少硬币。 在我获得交换 - itneger 95 之后,我需要根据数组键将其拆分,显示我收到的硬币数量和种类,并将这些硬币放回数组中。

我尝试过这种方式,但是如果 <= 找零

,程序只会给我每种硬币类型的 1 块
   if ($change > 0) {
      echo 'Your change is : '. $change;
      foreach (array_reverse($money, true) as $key => $amount) {
          if ($key <= $change) {
              echo 'Returned coin: ' . $key . PHP_EOL;
    }

这里是输出,你可以看到预期的输出是 95,但程序给了我 88

    In progress
    ***
    Your change is : 95
    Returned coin: 50
    Returned coin: 20
    Returned coin: 10
    Returned coin: 5
    Returned coin: 2
    Returned coin: 1

预期输出为:

    In progress
    ***
    Your change is : 95
    Returned coin: 1 x 50
    Returned coin: 2 x 20
    Returned coin: 1 x 5

类似的东西,然后将它们添加到我的货币数组中。

1 个答案:

答案 0 :(得分:0)

你很接近。您必须记住,可以返回特定硬币 $amount 次。所以我添加了另一个循环来做到这一点。不过,您必须跟踪当前的剩余价值。

$change = 95;
$rest = $change;

foreach (array_reverse($money, true) as $key => $amount) {
  for ($i = 0; $i < $amount; $i++) {
    if ($key <= $rest) {
      echo 'Returned coin: ' . $key . PHP_EOL;
      $rest -= $key;
    }
  }
}

工作example

替代方案

提前计算$key(当前硬币价值)适合多少$rest(剩余价值)。

foreach (array_reverse($money, true) as $key => $amount) {
  if ($key <= $rest) {
    $times = floor($rest / $key);
    echo sprintf('Returned coin: %u x %u', $times, $key) . PHP_EOL;
    $rest -= $key * $times;
  }
}

输出

Your change is : 95
Returned coin: 1 x 50
Returned coin: 2 x 20
Returned coin: 1 x 5

工作example

相关问题