Reading the PHP documentation has convinced me (again) of what a mind-bogglingly broken language this is. Quickly, see if you can predict this behavior:
<?php
echo "This is the integer literal octal 010: " . 010 . "\n\n";
$things = array(
"The 0th element",
"The 1st element",
"The 2nd element",
"The 3rd element",
"The 4th element",
"The 5th element",
"The 6th element",
"The 7th element",
"The 8th element",
"8" => "The element indexed by '8'",
"foo" => "The element indexed by 'foo'",
"010" => "The element indexed by '010'"
);
// The string index "8" clobbered the integer index 8.
// But the string index "010" didn't...
echo "Now check out what PHP thinks the array is...";
print_r ($things);
echo "\n\n";
// As expected
echo "\$things[0]: $things[0]\n";
echo "\$things[1]: $things[1]\n";
// Okay, so strings are interpreted as integers sometimes...
echo "\$things[\"0\"]: " . $things["0"] . "\n";
// Ah, now things become strange. This integer key gets the string "8" instead.
echo "\$things[8]: $things[8]\n";
// This should refer to the 8th element, but it gets converted to an integer by
// the preprocessor, then to a string, where it matches the clobbered 8th
// element...
echo "\$things[010]: " . $things[010] . "\n";
// This string key returns the expected "8" element...
echo "\$things[\"8\"]: " . $things["8"] . "\n";
// But this string octal key gets the "010" key as expected. Note that it
// *doesn't* get the integer 8, as you might expect from $things["0"]
echo "\$things[\"010\"]: " . $things["010"] . "\n";
echo "\n";
?>
Here’s the output (PHP 5.2.6-3ubuntu4.1):