потому, что:
1. массив трехмерный
2. если написать $chars[$i][$i] — то ключи будут только такими:
$chars[0][0]; $chars[1][1]; $chars[2][2] и т.д.
а чтоб они перебирались, во втором массиве счетчик идет для первых индексов, а в третьем — для вторых, и тогда получится:
$chars[0][0]; $chars[0][1]; $chars[0][2] ...
$chars[1][0]; $chars[1][1]; $chars[1][2] ...
$chars[2][0]; $chars[2][1]; $chars[2][2] ...
т.е. берем сначала первый индекс (например, 0), выводим всё, что есть с ним: 0-0, 0-1, 0-2
потом второй и т.д.