declare -a creates a numerically indexed array.
declare -A creates an associative array.
Numerically indexed arrays place the index part of var[idx]=value into an arithmetic context. In an arithmetic context, variables can be used without the "parameter expansion syntax" (i.e. the $). Unset variables use the value zero.
So, what you're doing with
declare -a car # '-a' used to let this variable have assigned values below
car[BMW]=i8
car[TOYOTA]=Corolla
car[Honda]=Civic
car[Mercedes]=Benz
is assigning each value to the index zero of the array.
declare -p is a handy way to inspect a variable:
$ declare -p car
declare -a car=([0]="Benz")
with declare -A instead, we get:
$ declare -p car
declare -A car=([Honda]="Civic" [TOYOTA]="Corolla" [BMW]="i8" [Mercedes]="Benz" )
-Anot-a, seehelp declareand arrays