I'm working on a quiz with 80 numbered questions. After every 4 questions there will be an unnumbered 5th bonusquestion. These 100 questions have index-numbers (1-100) in a database table. Maybe it'd have been more logical to use a separate table for the bonusquestions, but the client wants the questions in one table in that order.
I don't want to display the bonusquestion index-numbers in the interface of the quiz, therefore i need to skip every 5th index-number from the range of 100 questions.
I did manage to make a simple calculation which works well when i check it in a loop, but somehow i feel it's a rather dirty solution (ceil). Is there any way of writing this code in a neater or more logical way?
ActionScript:
for (var i:Number = 1; i < 101; i++) {
var displayIndex:Number = Math.ceil((i/5) * 4);
trace("i:" + i + " / " + displayIndex);
}
PHP:
for ($i = 1; $i < 101; $i++) {
echo "i: " . $i . " / displayIndex: " . (ceil(($i/5) * 4) . "<br>");
}
Edit: Let me try to visualize this
index-number = 1 -> display-number = 1
index-number = 2 -> display-number = 2
index-number = 3 -> display-number = 3
index-number = 4 -> display-number = 4
index-number = 5 -> display-number = none
index-number = 6 -> display-number = 5
index-number = 7 -> display-number = 6
index-number = 8 -> display-number = 7
index-number = 9 -> display-number = 8
index-number = 10 -> display-number = none
etc...
Your task is exotic enough, that your decision could to be fair enough for accomplishing it. It's simplifying it enough, yet nobody except you will understand it.
I'd suggest just adding a comment to it. However, there are plenty of other ways, which I cannot say they are more elegant, but maybe are more self-explanatory.
$counter = 1;
for ($i = 1; $i < 21; $i++) {
$displayNum = $counter;
if ($i % 5 == 0) {
$counter--;
$displayNum = "none";
}
echo "index-number = $i -> display-number = $displayNum <br/>";
$counter++;
}
Will result into:
index-number = 1 -> display-number = 1
index-number = 2 -> display-number = 2
index-number = 3 -> display-number = 3
index-number = 4 -> display-number = 4
index-number = 5 -> display-number = none
index-number = 6 -> display-number = 5
index-number = 7 -> display-number = 6
index-number = 8 -> display-number = 7
index-number = 9 -> display-number = 8
index-number = 10 -> display-number = none
index-number = 11 -> display-number = 9
index-number = 12 -> display-number = 10
index-number = 13 -> display-number = 11
index-number = 14 -> display-number = 12
index-number = 15 -> display-number = none
index-number = 16 -> display-number = 13
index-number = 17 -> display-number = 14
index-number = 18 -> display-number = 15
index-number = 19 -> display-number = 16
index-number = 20 -> display-number = none
If you try to minify it with ternary operator, you will end up with code just like yours, which is crypt, rather than explanatory.
You can skip the iteration with continue
and adding the desired output before that. The very same result can be achieved by:
$counter = 1;
for ($i = 1; $i < 21; $i++) {
if ($i % 5 == 0) {
echo "index-number = $i -> display-number = none <br/>";
continue; // more explanatory for SKIP THIS ITERATION
}
echo "index-number = $i -> display-number = $counter <br/>";
$counter++;
}
This way you will print none
and will skip the execution of the iteration, thus $counter
will not increment, and on 6-th iteration it will be 5.