

ある連想配列があり、`value` = 整数型が入っています。  
この値を特定の `Key` の順番ごとに減らしていきたのですが、カッコ悪くない実装方法や効率的な方法があったら教えてください。

**コード：**

[code]

    $array = ['banana'=>3, 'orange'=>2, 'apple'=>2];
    
    //banana -> orange -> apple の順に減らしたい。
    
    $subtraction　 = 3;//減らす数
    
    for($i = 0; $i < $subtraction ; $i++ )
    {
        if ($array['banana'] > 0 && ($i === 0 ||$i === 3 ||$i === 6  )) {$array['banana']--; continue;}
        if ($array['orange'] > 0 && ($i === 1 ||$i === 4  )) {$array['orange']--;continue;}
        if ($array['apple']  > 0 && ($i === 2 ||$i === 5  )) {$array['apple']--;continue;}
    }
    
[/code]


CC BY-SA 4.0
2022-05-24T10:24:59.270
89023
2022-05-26T04:39:23.687
2022-05-24T12:18:04.527
3060
45215
question
php
配列の中の値を1つずつ減らすにはどのようにすればいいのか？
  
  
> banana -> orange -> apple の順に減らす

の分岐条件を単純にして見ました。  
**$i_mod = $i % count($array);** は、定義された配列要素の数での余りを得ています。

[code]

    $array = ['banana'=>3, 'orange'=>2, 'apple'=>2];
    
    //banana -> orange -> apple の順に減らしたい。
    //順番を変える時は$arrayの登録順番を変える
    
    $subtraction = 3;//減らす数
    
    $array_key = [];//番号でアクセスできるように配列を作る。
    foreach($array as $key=>$value){
      $array_key[] = $key;
    }
    
    for($i = 0; $i < $subtraction; $i++ )
    {
      $i_mod = $i % count($array); //$i % 3
      $key = $array_key[$i_mod];
      if ($array[$key] > 0) {
        $array[$key]--;
      }
    }
    
[/code]

_カッコ悪と思うのは理解せずに作成しているからと思うのですが_


CC BY-SA 4.0
2022-05-25T09:12:03.460
89046
2022-05-25T09:33:33.417
2022-05-25T09:33:33.417
22793
22793
89023
answer


コメントにも書きましたが、掲示されているコードでは配列の値が `0` の場合は decrement しないのに `$subtraction` の値が
decrement されています。  
以下は、配列の値が `0` の場合は `$subtraction` の値をそのままにする、という仕様を前提としています。

[code]

    <?php
    
    $array = ['banana'=>2, 'orange'=>1, 'apple'=>6];
    $order = ['banana', 'orange', 'apple']; // 減らす順序
    $subtraction = 7; // 減らす数
    
    $subtraction = min($subtraction, array_sum($array));
    $len = count($order);
    for($i=0;$subtraction;$i=(++$i)%$len) {
        if ($array[$order[$i]] > 0) {
            $array[$order[$i]]--;
            $subtraction--;
        }
    }
    
    print_r($array);
    
    //
    // Array
    // (
    //     [banana] => 0
    //     [orange] => 0
    //     [apple] => 2
    // )
    
[/code]


CC BY-SA 4.0
2022-05-26T04:39:23.687
89064
2022-05-26T04:39:23.687
47127
89023
answer