通过一次迭代一次向数组添加值

时间:2018-02-15 11:11:41

标签: php arrays loops

我试图通过在时间上添加一个点来使这个功能工作,直到没有更多。 我要做的是,让它将"Torsk"值增加1,然后转到下一个,递增1,然后依次打开,直到$prize中设置的所有点都有已经分发。

$prize = [
    "Torsk" => 0,
    "Rødspætte" => 0,
    "Mørksej" => 0,
    "Skrubbe" => 0,
    "Lubbe/Lyssej" => 0,
    "Ising" => 0,
    "Lange" => 0,
    "Makrel" => 0,
    "Hornfisk" => 0,
    "Pig-/Slet-hvar" => 0,
    "Havkat" => 0,
    "Laks/Havørred" => 0,
];

$points = 21;

for ($i = 0; $i < $points; ++$i) {

    foreach ($prize as $key => $value) {

      $prize[$key]++;

      if (array_sum($prize) == $points) continue;

    }
}

echo array_sum($prize);
echo "<br />";
print_r($prize);

当它完成时我希望数组是这样的:

$prize = [
    "Torsk" => 2,
    "Rødspætte" => 2,
    "Mørksej" => 2,
    "Skrubbe" => 2,
    "Lubbe/Lyssej" => 2,
    "Ising" => 2,
    "Lange" => 2,
    "Makrel" => 2,
    "Hornfisk" => 2,
    "Pig-/Slet-hvar" => 1,
    "Havkat" => 1,
    "Laks/Havørred" => 1,
];

但事实并非相反,它只是为所有人增加了21。

3 个答案:

答案 0 :(得分:3)

你可以使用break 2;在达到条件时从外循环中断,例如:

for ($i = 0; $i < count($prize); ++$i) {

    foreach ($prize as $key => $value) {

      $prize[$key]++;

      if (array_sum($prize) == $points) {
          break 2;
      }

    }
}

答案 1 :(得分:0)

试试这段代码:

$prize = [
        "Torsk" => 0,
        "Rødspætte" => 0,
        "Mørksej" => 0,
        "Skrubbe" => 0,
        "Lubbe/Lyssej" => 0,
        "Ising" => 0,
        "Lange" => 0,
        "Makrel" => 0,
        "Hornfisk" => 0,
        "Pig-/Slet-hvar" => 0,
        "Havkat" => 0,
        "Laks/Havørred" => 0,
];

$points = 21;

foreach ($prize as $key => $value) {

    $prize[$key]++;

    if (array_sum($prize) == $points) break;

}

if(array_sum($prize) < $points){
    foreach ($prize as $key => $value) {

        $prize[$key]++;

        if (array_sum($prize) == $points) break;

    }    
}   

echo array_sum($prize);
echo "<br />";
print_r($prize);

答案 2 :(得分:0)

您应该使用break 2;代替continue来破坏两个嵌套的封闭结构。

以下是执行相同任务的改进方法。

<?php


/**
 * Disturbe values until the sum is equal to $points
 * @param $prize array
 * @param $points integer
 * @return array|false
 */
function distribute_prize( $prize = array(), $points = 21 ){

    $sum = array_sum( $prize );
    if( $sum == $points ) return $points;
    elseif( $sum > $points || $points < 0 ) return false;

    while( true ){
        foreach ($prize as $key => $value) {
            $prize[$key]++;
            if( array_sum( $prize ) == $points ) break 2;

        }
    }

    return $prize;
}

// TEST
$prize = [
    "Torsk" => 0,
    "Rødspætte" => 0,
    "Mørksej" => 0,
    "Skrubbe" => 0,
    "Lubbe/Lyssej" => 0,
    "Ising" => 0,
    "Lange" => 0,
    "Makrel" => 0,
    "Hornfisk" => 0,
    "Pig-/Slet-hvar" => 0,
    "Havkat" => 0,
    "Laks/Havørred" => 0,
];

$points = 21;
print_r( distribute_prize( $prize, $points ) );