At the most atomic level, its simply due down to being binary.
0 => 0
1 => 1
10 => 2
11 => 3
"0" is the first binary number, and likewise arrays are index by their "first" binary number.
Also, given An arbitrary base address for a dataset, the first record exists at that address, not that address + 1,
$base = 010110;
$firstvalue = $base + 0 * $unitsize
$secondvalue = $base + 1 * $unitsize
$thirdvalue = $base + 2 * $unitsize
If you had a "1" based array the internal system would have to constantly decrement the target value by 1 to find the underlying memory address that data was stored at.
0 is just as much the first binary number as it is the first decimal number. Not compelling.
Write the number "0" on a page. How many numbers do you have?
If I have the numbers 500 to 550 on the page, how many numbers do I have? I have 51! But the difference is only 50.
Put 50 sheep in a paddock. Surprisingly, none of them look like numbers, but they are still a countable volume.
We however have this crazy idea that when a sheep looks a little bit too much like a 0, it must not be used, and it must be thrown out and we have to find a sheep looking like 50 to take its place.
Simplified
Use 1 to N for counting.
But 0 is still a valid place holding symbol, and as such, it should be used.
If 0 is not a valid place holding symbol, then we should scrap 10, 20, 30, 40 ... etc from our number system, and go straight from 9 to 11.
1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27
In essence, we humans not starting with "0" is a CULTURAL thing. Its not a rational one.