Работа вокруг цикла

Я заметил подобное повторение и пытаюсь работать с помощью одного цикла для этого, если могу уменьшить длину кода:

Мне не нужно будет использовать случай переключения, если я могу сформировать цикл вместо этого?

  1. $ returnNo переменная начинается с 5, каждый случай умножается на 2, а затем минус 1.

  2. где он показывает «$ a <=», он начинается с 5 и каждый случай умножается на 2, а затем плюс 3.

  3. оператор if (), начинающийся с if ($ matchno == 7), каждый случай умножается на 2, затем плюс 1.

  4. окончательный оператор if (), начинающийся с if ($ matchno == 8), каждый случай умножается на 2.

  5. Я сделал это до 64-го случая, это будет фактически до 512. Как я знаю, код повторяется, я надеюсь, кто-то может помочь мне создать единый цикл для этого?

Большое спасибо!

switch($max) { case 80 : $returnNO = 5; for($a = 1; $a<=5; $a++) { if($matchno == $a || $matchno == ($a+1)){ $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } $returnNO++; $a++; } if($matchno == 7){ $matchinfo['winner'] = true; return $matchinfo; }elseif($matchno == 8){ $matchinfo['third_winner'] = true; return $matchinfo; } break; case 160 : $returnNO = 9; for($a = 1; $a<=13; $a++) { if($matchno == $a || $matchno == ($a+1)){ $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } $returnNO++; $a++; } if($matchno == 15){ $matchinfo['winner'] = true; return $matchinfo; }elseif($matchno == 16){ $matchinfo['third_winner'] = true; return $matchinfo; } break; case 320 : $returnNO = 17; for($a = 1; $a<=29; $a++) { if($matchno == $a || $matchno == ($a+1)){ $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } $returnNO++; $a++; } if($matchno == 31){ $matchinfo['winner'] = true; return $matchinfo; } elseif($matchno == 32){ $matchinfo['third_winner'] = true; return $matchinfo; } break; case 640 : $returnNO = 33; for($a = 1; $a<=61; $a++) { if($matchno == $a || $matchno == ($a+1)){ $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } $returnNO++; $a++; } if($matchno == 63){ $matchinfo['winner'] = true; return $matchinfo; }elseif($matchno == 64){ $matchinfo['third_winner'] = true; return $matchinfo; } break; } } 

Solutions Collecting From Web of "Работа вокруг цикла"

В качестве примера я использую первые два случая:

 switch ($max) { case 80: $returnNO = 5; $loopCount = 5; $winner = 7; $thirdWinner = 8; break; case 160: $returnNO = 9; $loopCount = 13; $winner = 15; $thirdWinner = 16; break; ... } for ($a = 1; $a <= $loopCount; $a++) { if ($matchno == $a || $matchno == ($a + 1)) { $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } } if ($matchno == $winner) { $matchinfo['winner'] = true; return $matchinfo; } else if ($matchno == $thirdWinner) { $matchinfo['third_winner'] = true; return $matchinfo; } 

Просто объясните, удалите код, который повторяется все время, и попытайтесь его параметризовать (либо путем создания функции, либо путем помещения всего повторяющегося кода в другое место … в этом примере я поместил повторяющийся код после оператора switch и проанализировал его.

Если бы я хорошо понял, вот альтернативное решение, которое, я думаю, будет работать для всех случаев, которые вы указали, без использования корпуса коммутатора.

 $div10 = $max / 10; $maxLoop = $div10 - 3; $returnNO = $div10 / 2 + 1; for($a = 1; $a<=$maxLoop; $a++) { if($matchno == $a || $matchno == ($a+1)){ $matchinfo['matchno'] = $returnNO; $matchinfo['place'] = ($matchno == $a ? 'clan1' : 'clan2'); return $matchinfo; } $returnNO++; $a++; } if($matchno == ($div10-1)){ $matchinfo['winner'] = true; return $matchinfo; }elseif($matchno == $div10){ $matchinfo['third_winner'] = true; return $matchinfo; }