![]() |
![]() |
![]() |
![]() |
![]() |
![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
[1 апреля 2002 г.] |
В этой и следующих наблах я попытаюсь кратко систематизировать всю идеологию работы с переменными сложной структуры в PHP и Perl. Начнем мы с более простых
Но сначала давайте договоримся о терминологии. Итак, массив переменная, хранящая сразу несколько значений. Добраться до конкретного значения можно при помощи указания его индекса обязательно целого числа (возможно, полученного в результате вычислений). Как правило, самый первый элемент массива имеет индекс 0 (а не 1), а значит, последний элемент имеет индекс, на 1 меньший размера массива. Хэш (переводится как «мешанина») практически то же самое, что и массив, но в качестве индекса используется не число, а произвольная строка. Индексы хэша называются ключами, а соответствующие им величины
![]() |
Эта терминология (на мой взгляд, весьма удачная) заимствована из Perl.
|
Как известно, в PHP имена всех переменных необходимо предварять символом
$a=10; print "Значение $а, вставленное в строку";
В отличие от Perl, правило со знаком доллара применяется здесь абсолютно ко всем переменным, будь они массивами, хэшами или же простыми скалярами. Начнем с массивов. Обращения к элементу массива производится очень
# пусть $A - это массив print $A[10]; # печатает элемент с индексом 10
Конечно, допустимы и следующие конструкции:
$i=2; print $A[$i]; # печатает 2-й элемент print $A[$i*$i]; # печатает 4-й элемент
Чтобы вставить значение элемента массива в строку, можно написать (здесь и далее речь идет о PHP версии 4):
$i=2; print "Проверка: $A[0]"; print "Еще раз: $A[$i]";
![]() |
Замену переменной на ее значение в строке часто называют |
Однако в более сложных случаях (когда, например, индекс равен
$i=2; print "Сложный индекс: {$A[$i*$i]}";
![]() |
Обратите внимание, что знак |
Этот синтаксис универсален: в квадратных скобках массива может стоять все, что угодно, например:
print "Последний элемент: {$A[count($A)-1]}";
В качестве элемента массив может содержать не только скаляр, но и другой массив. В этом случае его называют «многомерный массив», или матрица, но рассматривать его лучше не как прямоугольную таблицу, а именно как «массив массивов» (потому что подмассивы вполне могут иметь разный размер, так что вполне возможно существование «треугольного массива»). Обращение к элементам двумерных массивов производится так же:
# печатает 2-й элемент 1-го подмассива print $A[1][2]; # вставляет значение в строку print "Значение в строке: {$A[1][2]}";
Обратите внимание, что нельзя написать:
# неправильно! print "Значение в строке: $A[1][2]";
Это просто не сработает. Так что особо не удивляйтесь, когда вместо ожидаемого результата программа напечатает что-то вроде
Теперь о хэшах в PHP. Вообще говоря, обращения к ним принципиально ничем не отличается от обращений к
$k="ключ"; print $H["какой-то ключ"]; print $H[$k]; print $H[$k."хвостик"]; print $H[$k]["двумерный хэш"]; print "Вставляем в строку: {$H[$k.'!']['что-то']}"; print "Особенно интересно: {$H[$k]["что-то"]}";
Можно подумать, что в последний пример вкралась опечатка, и кавычки внутри строки необходимо экранировать при помощи
В общем, все это достаточно логично, и вряд ли можно сделать как-то проще. Чтобы окончательно увериться в этой мысли, рассмотрим, как можно быстро и просто создавать массивы и хэши в программе:
# создаем массив c индексами 0, 1, 2 $A = array('a','b','c'); # создаем двумерный треугольный массив $A = array( array('a','b','c'), array('d','e'), array('f') ); # создаем хэш $H = array('k1'=>'a', 'k2'=>'b', 'k3'=>'c'); # более удобно - меньше апострофов $H = @array(k1=>'a', k2=>'b', k3=>'c'); # хэш массивов $H = @array( k1 => array('a','b','c'), k2 => array('d','e'), k3 => array('f'), k4 => $A # подставляем целый массив );
Массив создается простым перечислением его элементов. При создании хэша необходимо также указывать и ключи (слева от стрелочки
![]() |
Обратите внимание на то, насколько использование |
Мы знаем, как можно получить доступ к произвольному элементу массива и хэша. Однако чаще всего приходится решать и более общую задачу: выбрать и обработать сразу все элементы. Для массивов это можно сделать вот
for($i=0; $i<count($A); $i++) print "Значение элемента $i: $A[$i]<br>";
Однако этот подход не годится и для хэшей: мы не можем просто сделать
foreach($H as $k=>$v) print "Ключ: $k, значение: $v<br>";
Впрочем, с его помощью можно перебирать и массивы (подставив вместо хэша
![]() |
Разумеется, имена |
Если же при переборе вас совершенно не интересуют индексы элементов, то цикл можно упростить:
foreach($A as $v) print "Значение: $v<br>";
![]() |
Нужно заметить, что цикл |
При всяком переборе возникает вопрос: в каком порядке будут идти элементы масива или хэша?.. Для обычных массивов ответ более-менее
В действительности аналогия между массивами и хэшами значительно глубже, и без преувеличения можно заявить, что массив в
$AH = array( 2 => 'c', 1 => 'b', 0 => 'a', ); foreach($AH as $v) print $v;
Здесь будет напечатана строчка
![]() |
Обратите еще внимание на, казалось бы, лишнюю запятую перед закрывающей круглой скобкой. На первый взгляд (особенно после Java) кажется, что тут должна быть синтаксическая ошибка, однако ее нет ни в PHP, ни в Perl, ни даже в Си. Почему?.. Все очень просто: такой синтаксис позволяет в будущем легко модифицировать программу и добавить новый элемент в конец массива. Если бы не было финальной запятой, вы вполне могли бы забыть ее напечатать, вставив новую строку.
|
Вообще,
![]() |
В действительности, конечно, для массивов применяются дополнительные оптимизации, но они «не видны» программисту на PHP.
|
В следующей набле мы рассмотрим хэши и массивы в языке Perl. Как вы увидите, в этом языке сложные объекты имеют несколько иные свойства (более выраженные).
![]() |
|
Дмитрий Котеров |
1 апреля 2002 г.
©1999-2018
|
|
Вернуться к оглавлению |