![]() |
![]() |
|
||
![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||
| [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-2010 | | Контакт | Вернуться к оглавлению |