Honestly? I really don't know, I'm guessing it's because of PHP's similarity to the C programming language, and traditionally all versions of C and C++ start array indexes at 0, it may also be to do with the way loops work, all I know is that if the PHP function "count()" returns a number other than 0, then your highest index is that number minus 1.
Arrays don't always have to hold the same types
Just because an array is set up as a 'shopping list' or 'age list' it does not mean that you have to always put that type of data in it, you can freely mix and match data types and PHP will adapt automatically, eg:
print_r is a fantastic function for debugging, because it displays the array structure and it's contents in a nice neat tree diagram, if you are using print_r in a web page though, you will want to print an opening and closing pre tags (<pre> </pre>) on either side of it to preserve the layout.
Nested arrays are great for representing complex data, unfortunately you still need to remember your indexes and the deeper you go the more complex this becomes, how do you remember that "$myArray" is equal to the first name of the second cousin in the third family of the family tree? That's solved by the one thing we've not covered yet and that's hashes.