首页 > 解决方案 > 如何根据数组键拆分整数,然后根据我如何拆分该整数添加值

问题描述

我有数组 $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 我需要根据数组键将其拆分,显示我得到了多少和什么样的硬币并将这些硬币放回数组中。

我尝试过这种方式,但如果是 <= change,programm 只返回每种硬币类型的 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

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

标签: phparrays

解决方案


你很接近。您必须记住,有可能返回特定的硬币$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;
    }
  }
}

工作示例

选择

预先计算有多少$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

工作示例


推荐阅读