Главная Свежие Последние Лучшие Контактная информация  
 
 


Справочник языка » Типа данных: Массивы
Массивы
Массив в PHP это упорядоченная карта. Карта/map это тип, который отображает значения в ключи. Этот тип оптимизируется разными способами, поэтому вы можете использовать его как реальный массив или список (вектор), хэш-таблицу (которая является реализацией карты), словарь/dictionary, коллекцию/collection, стэк/stack, очередь/queue и, возможно, что-то ещё. Поскольку вы можете иметь другой PHP-массив в качестве значения, вы можете также довольно легко симулировать деревья/trees.

Объяснение этих структур выходит за рамки данного учебника, но вы можете найти как минимум по одному примеру для каждой этой структуры. За дополнительной информацией об этих структурах мы отсылаем вас к литературе по этой обширной теме.

Синтаксис
Специфицирование с помощью array()
Массив может быть создан конструкцией языка array(). Она принимает определённое количество разделённых запятыми пар key => value (ключ-значение).

key это либо integer, либо string. Если ключ это стандартное представление integer, он будет интерпретироваться как таковой (т.е. "8" будет интерпретироваться как 8, а "08" будет интерпретироваться как "08").

Значение может быть любым.

Если вы опускаете ключ, берётся максимальный целочисленный индекс, а новый key будет равен этому максимуму + 1. Поскольку целые числа могут быть отрицательными, это верно также и в отношении отрицательных индексов. Если, например наивысший индекс -6, это даст в результате для нового ключа -5. Если ещё нет ни одного целочисленного индекса, key будет 0 (нуль). Если вы специфицируете ключ, который уже имеет присвоенное значение, это значение будет перезаписано.

Использование true в качестве ключа будет вычисляться в integer 1 в качестве ключа. Использование false в качестве ключа будет вычисляться в integer 0 в качестве ключа. Использование NULL в качестве ключа будет вычисляться в пустую строку. Использование пустой строки в качестве ключа создаст (или перезапишет) ключ пустой строкой в качестве значения, это не то же самое, что использование пустых угловых скобок.

Вы не можете использовать массивы с объектами в качестве ключей. Если это сделать, появится предупреждение: Illegal offset type.

array( [key =>] value
, ...
)
// key это либо string, либо неотрицательное integer
// value\значение может быть любым


Создание/модифицирование с помощью синтаксиса квадратных (угловых) скобок
Вы также можете модифицировать существующий массив, явно установив значения.

Это делается путём присвоения значений массиву через специфицирование key в квадратных скобках. Вы можете также опустить key, добавив пустую пару угловых скобок ("[]") паре имя-значение.

$arr[key] = value;
$arr[] = value;
// key это либо string, либо неотрицательное integer
// value может быть любым


Если массив $arr ещё не существует, он будет создан. Итак, это альтернативный способ специфицирования массива. Для изменения конкретного значения просто присвойте ему новое значение. Если вы хотите удалить пару key/value, вы должны её unset().

Используемые функции
Имеется достаточное количество функций для работы с массивами, см. раздел Функции массивов.

Примечание: функция unset() позволяет отменить установку ключа массива. Не забудьте, что при этом массив НЕ реиндексируется.

$a = array( 1 => 'one', 2 => 'two', 3 => 'three' );
unset( $a[2] );
/* даст массив, который определён как
$a = array( 1=>'one', 3=>'three');
а НЕ как
$a = array( 1 => 'one', 2 => 'three');
*/


Структура управления foreach существует специально для массивов. Она даёт возможность без усилий просматривать массив.

Массив может и не может
Почему $foo[bar] неправильно?
Вы всегда должны использовать кавычки вокруг индекса ассоциативного массива. Например, пишите $foo['bar'], а не $foo[bar]. Но почему не верна запись $foo[bar]? Вы могли встретить в старых скриптах такой синтаксис:

$foo[bar] = 'enemy';
echo $foo[bar];
// etc


Это неправильно, но работает. Тогда почему неправильно? Суть в том, что этот код содержит неопределённую константу (bar), а не строку 'bar' (обратите внимание на кавычки), и PHP может в дальнейшем определить константу, которая, к несчастью для вашего кода, имеет то же самое имя. Это работает, поскольку неопределённая константа конвертируется в строку с тем же именем.

Как указано в разделе синтаксис, между квадратными скобками ('[' и ']') должно иметься выражение. Это означает, что вы можете записать:

echo $arr[ foo(true) ];


Это пример использования return-значения функции в качестве индекса массива. PHP знает также и о константах, и вы можете увидеть спереди E_*.

$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";


Обратите внимание, что E_ERROR это такой же идентификатор, как и bar в первом примере. Но последний пример равносилен записи:

$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";


поскольку E_ERROR равна 1, etc.

Тогда как может работать $foo[bar]? Это работает, поскольку bar, по причине своего синтаксиса, ожидается как константное выражение. Однако в этом случае константа с именем bar не существует. PHP теперь принимает, что вы обозначили bar литерально как строку "bar", но что вы забыли указать кавычки.

Так почему же это неправильно?
Когда-нибудь в будущем команда PHP может добавить другую константу или ключевое слово, и у вас появятся проблемы. Например, вы уже не можете использовать слова empty и default таким способом, поскольку они являются теперь зарезервированными ключевыми словами.

Примечание: когда вы переключите error_reporting на E_ALL, вы увидите, что PHP генерирует уведомления, когда используется index, который не определён (поместите строку error_reporting(E_ALL); в ваш скрипт).

Примечание: внутри string, ограниченной двойными кавычками, другой синтаксис является правильным. См. разбор переменных в строках.

Примеры
Тип array в PHP является очень подвижным, поэтому мы даём здесь несколько примеров, демонстрирующих всю мощь массивов.

// это ...
$a = array( 'color' => 'red'
, 'taste' => 'sweet'
, 'shape' => 'round'
, 'name' => 'apple'
, 4 // key будет 0
);

// ... абсолютно эквивалентно этому
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // key будет 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// даст в результате массив array( 0 => 'a' , 1 => 'b' , 2 => 'c' ),
// или просто array('a', 'b', 'c')

Пример 6-4. Использование array()
// Массив как карта (свойств)
$map = array( 'version' => 4
, 'OS' => 'Linux'
, 'lang' => 'english'
, 'short_tags' => true
);

// строго цифровые ключи
$array = array( 7
, 8
, 0
, 156
, -10
);
// это то же самое, что и array( 0 => 7, 1 => 8, ...)

$switching = array( 10 // key = 0
, 5 => 6
, 3 => 7
, 'a' => 4
, 11 // key = 6 (максимум целочисленного индекса был 5)
, '8' => 2 // key = 8 (целое число!)
, '02' => 77 // key = '02'
, 0 => 12 // значение 10 будет перезаписано на 12
);

// пустой массив
$empty = array();


Пример 6-5. Коллекция
$colors = array('red','blue','green','yellow');

foreach ( $colors as $color ) {
echo "Do you like $color?\n";
}

/* на выходе:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
*/



Заметьте, что в настоящее время нельзя изменять значения массива в таких циклах напрямую.
Но можно сделать так:Пример 6-6. Коллекция
foreach ($colors as $key => $color) {
// не будет работать:
//$color = strtoupper($color);

//работает:
$colors[$key] = strtoupper($color);
}
print_r($colors);

/* на выходе:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
*/




Следующий пример создаёт одномерный массив.Пример 6-7. Одномерный индекс
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);

/* на выходе:
Array
(
[1] => 'January'
[2] => 'February'
[3] => 'March'
)
*/


Пример 6-8. Заполнение реального массива
// заполним массив всеми элементами директории
$handle = opendir('.');
while ($file = readdir($handle))
{
$files[] = $file;
}
closedir($handle);




Массивы упорядочены. Вы можете изменять порядок в массиве, используя различные функции сортировки. См. функции массивов.

Пример 6-9. Сортировка массива
sort($files);
print_r($files);



Поскольку значение массива может быть любым, это может быть также другой массив. Так вы можете создать рекурсивный и многомерный массивы.

Пример 6-10. Рекурсивный и многомерный массивы
$fruits = array ( "fruits" => array ( "a" => "orange"
, "b" => "banana"
, "c" => "apple"
)
, "numbers" => array ( 1
, 2
, 3
, 4
, 5
, 6
)
, "holes" => array ( "first"
, 5 => "second"
, "third"
)
);


Добавить в закладки:

 

теги: массивы
 

  Еще статьи
Типа данных: Числа с плавающей точкой 183
Операции: Арифметические операции 170
Константы: Предопределённые константы ядра 71
cal_days_in_month 179
Использование удалённых/remote файлов 184
 


  Категории
Начнем 13
Справочник языка 89
Возможности 12
Функции 142
Расширение PHP 4.0 0
FAQ 0
 

  Теги
 

  Лучшее на сайте
Безопасность: Скрытие PHP 472
Что такое PHP? 446
Безопасность: Данные, отправляемые пользователем 374
foreach 354
Файл конфигурации 334
Безопасность: Безопасность баз данных 334
Операции: Строковые операции 311
Безопасность: CGI-двоичный 306
Безопасность: Безопасность файловой системы 298
Безопасность: Обзор 291
 

  Друзья сайта
организация свадеб, Оформление зала
 

  Интересное
 

 
Использование материалов только при активной гиперссылке "http://iamcoder.net"
Copyright 2008 http://iamcoder.net Серия сайтов: "Стань умным!".