Each time you
AD[2]=something
You override what was previously there. It seems as though you want the entries (or just this entry) to be a list, which is not allowed, but you could fake it with a string
AD[2]="bbbb eeee ffff"
If you want to return the entry as an array, simply return
(${AD[2]})
This of course only works if you do not have spaces in your words. If you do, deciding on a splitting token and using (${AD[2]//;/ }) would work (with ; as a token). To work with this string based approach, you would have to append your array as follows:
AD[2]+=" aaa"
Dd[2]+=" bbb"
AD[2]+=" ccc"
That way if you want to print given "2" them words one by one then:
for word in ${AD[2]}; do
echo "$word"
done
Again, by not quoting AD[2] I allow bash to separate the words by spaces. A safer approach, using an agreed about token might be
AD[2]+=";aaa"
AD[2]+=";bbb"
AD[2]+=";ccc"
IFS=";" read -ra arr <<< "${AD[2]}"
for word in "${arr[@]}"; do
[ -z "$word" ] && continue # If I always use += to add to the array the first word is empty. Use AD[2]=aaa to avoid this rather than +=.
echo "$word"
done