Простой тест (находит числа, длинной 2 и более цифр и в первую группу попадает первая цифра, а во вторую - все остальные):
<?php
$str = "1222 3444 5666";
preg_match_all('/\b(\d)(\d+)\b/', $str, $a);
print_r($a);
?>
Результат:
Array
(
[0] => Array
(
[0] => 1222
[1] => 3444
[2] => 5666
)
[1] => Array
(
[0] => 1
[1] => 3
[2] => 5
)
[2] => Array
(
[0] => 222
[1] => 444
[2] => 666
)
)
Читаем доку:
Параметр flags.
If no order flag is given, PREG_PATTERN_ORDER is assumed
PREG_PATTERN_ORDER
Orders results so that $matches[0] is an array of full pattern matches, $matches[1] is an array of strings matched by the first parenthesized subpattern, and so on.
Пересказ: в $matches[0] попадают фрагменты строки, захваченные всем регулярным выражением, в $matches[1] - фрагменты, захваченные первой группой (скобками), в $matches[2] - второй и т.д.
Это было о preg_match_all.
Теперь о твоей ошибке: ты заключила в кавычки $zt[1][0].
Такой вот наглядный тест:
<?php
$a = array(
1,
array(2, 3)
);
echo "$a[0]\n";
echo "$a[0][1]\n";
echo "$a[1]\n";
echo "$a[1][0]\n";
?>
Нулевой элемент - скаляр, первый элемент - массив.
При заключение
строки в двойные кавычки происходит ее
интерполяция. При этом ищутся внутри упоминания переменных (например, "$v") и элементов массива (например, "$a[1]"). НО, массивы в PHP одномерные! Т.е. выражение
"$a[1][0]" означает тоже, что и
"$a[1]" . "[0]" !
Результат это наглядно демонстрирует:
Якобы двухмерность массива достигается тем, что в первом уровне хранятся ссылки на массивы, составляющие второй уровень.
$zt[1] - это ссылка на массив.
$zt[1][0] - нулевой элемент в одномерном массиве, ссылка на которой хранится как первый элемент массива $zt.
Теперь понятно?