PHP Build a Basic PHP Website (2018) Listing and Sorting Inventory Items Random Fun with Arrays

caroline
caroline
6,974 Points

Need help with quiz question

In the quiz Working with Functions, the answer to the question 'What does this code display"? is apparently 321. I cannot for the life of me figure out how 321 is the answer.

For a start, if $output = $number . $output, it would echo

1 ""

after the first cycle, because $number = 1, and $output = "".

Or am I being really stupid?

If anyone could walk me through this I'd be really grateful. (Code pasted below.)

<?php

$numbers = array(1,2,3,4);

$total = count($numbers);

$sum = 0;

$output = "";

$i = 0;

foreach($numbers as $number) {

$i = $i + 1;

if ($i < $total) {

    $output = $number . $output;

}

}

echo $output;

?>

4 Answers

Filipe Pacheco
Filipe Pacheco
Full Stack JavaScript Techdegree Student 21,412 Points

Hi, Caroline,

Remember that the foreach loop will loop through each array value. So if it has 4 values, it will loop 4 times. Let's try to go through the code each time the loop runs it. Remember the first line of code inside the foreach loop.

$i = 0;
foreach($numbers as $number) {

    $i = $i + 1;

}

So running through it the first time, $i will be 0 + 1, so when the loop ends the first time, $i = 1. This value will keep stored in this variable for the next loop, so in the second loop, the code will be $i = 1 + 1; So now, $i is equal to 2. Again, this value will be stored in the variable $i. Now the third time, $i = 2 + 1;, which is equal to 3. Now the fourth time, $i = 3 + 1, which is 4. Since the array has only four values, the loop runs only 4 times. So now will know the first time, $i was equal to 1, the second time it was 2, the third was 3 and the fourth was 4.

Now we will go to the second line of code.

foreach($numbers as $number) {

    $i = $i + 1;

    if ($i < $total) {

    $output = $number . $output;

}
}

The if statement says to run the line of code inside it only if $i is less than the $total. Since $total = count($numbers);, it mean that $total is equal to 4, so the if statement says if($ i < 4). Which means it will run until 3. So the conde inside that statement will be executed only 3 times.

Now let's execute that code each time until 3, to see what happens.

In the first time , it will fetch the first value of the array, so $number will be equal to 1. Now the $output will be 1 concatenated to the previous output. Since this is the first loop, the output has no value, so $output = 1 + 0;

$number = 1;
$output = "";
$output = $number . $output;
$output = 1 . "";
$output = 1;

Now that it looped the first time, the value 1 was stored in the output for the next loop. Since it's now the second loop, it will fetch the second value from the array, which is 2, so now $number = 2 and $output = 1, if you concatenate them, $output will be 21.

$number = 2;
$output = 1;
$output = $number . $output;
$output = 1 . 2;
$output = 21;

Now for the third and last time, the value fetched will be 3, so $number = 3 and $output = 21. If you concatenate them, $output will be 321.

$number = 3;
$output = 21;
$output = $number . $output;
$output = 3 . 21;
$output = 321;
caroline
caroline
6,974 Points

Hi Filipe

Thank you so much for taking the time to write such a detailed explanation - it's so helpful! I understand how the foreach loop works, and why the code only executes 3 times. I'm getting closer to understanding why we end up with 321, but I'm still confused about the $output variable.

What I don't understand is how: $output = 1 . "";

becomes

$output = 1;

I would have thought concatenating 1 and "" (ie 1 . "") would give us 1"". However, that's clearly not the case. Can you explain what those quotation marks are doing? Is it just because the $output variable can't be empty when it's declared? I suppose this would tie up with what you say about $output initially having 'no value'.

Nafis Fuad
Nafis Fuad
35,504 Points

Amazing explanation @filipepacheco. :smile: :clap: :clap: :smile:

caroline
caroline
6,974 Points

OK - I have now done my own homework (!) and found the answer here http://us2.php.net/manual/en/function.empty.php. The "" means that the variable is empty. My next question is - why use '"" instead of NULL or FALSE? Substituting NULL or FALSE also seems to work.

Filipe Pacheco
Filipe Pacheco
Full Stack JavaScript Techdegree Student 21,412 Points

I'm glad to know it helped.

That's, right. And yes, you can use null, or 0 (I'm not sure about the false), but It just means that the variable is empty. I'm still studying php, so I put inside the quotation marks because this is what I see most people usually doing. But anyways, in the first loop you can just ignore the concatenation to the output, since it's empty.

caroline
caroline
6,974 Points

Thanks Felipe!