Oh I love puzzles. I will take a stab in the dark here and say: the dot concatenates 20 with -30 which apparently gives the error (as printed "0") due to the - sign. So you might think it would look like: 20-30, but it is an error being reported.
There are clearly two different operators here with the same level of associativity ('.', '-'). Both operators use left associativity (meaning we work left to right), which means we are not concating 20 and -30, since that would involve calculations on the right hand before the left hand.
This breaks (20 . -10-20) into the following parts (20 . -10) and -20. Now we are concating 20 . -10 together, we do not get 10 because when the results are combined, due to the concat operator, we get "20-10", which is a STRING. You can verify this yourself by using gettype(20 . -10).
Now to understanding why the result is 0, which involves understanding how PHP converts Strings to Integers. A quick search on Type Juggling might help. PHP will convert "20-10" to be 20, because of the '-' character it cannot do anything further to attempt to determine the Integer value. In fact it does not matter if that -10 is *, or even the word apple from the perspective of String to Integer conversion in PHP.
So what that leaves us with is this:
print(20 . -10-20) is converted to print("20-10" - 20), which then gets converted to print(20 - 20), which is 0.