Реферат на тему массивы php

Обновлено: 05.07.2024

Массив

это
упорядоченный
набор
данных,
идентифицируемых с помощью одного (одномерные) или
нескольких (многомерные) индексов.
Основные типа массивов:
• Гомогенные (однотипные) и гетерогенные;
• Индексные (линейные) и ассоциативные;
• Статические и динамические.

3. Гомогенные и гетерогенные массивы

Гомогенный массив – массив, содержащий элементы данных
одного типа.
Гетерогенный массив – массив, в разные элементы которого
могут быть записаны значения, относящиеся к различным
типам данных.
Гетерогенные массивы удобны как универсальная структура
для хранения наборов данных произвольных типов. С другой
стороны, реализация гетерогенности требует усложнения
механизма поддержки массивов в трансляторе языка.
Гетерогенный массив как встроенный тип данных
присутствует в языке PHP.

4. Индексный массив

Индексный (простой) массив — именованный набор
переменных, расположенных в памяти непосредственно друг за
другом, доступ к которым осуществляется по индексу.
Индекс массива — обычно целое число, указывающее на
конкретный элемент массива.

5. Ассоциативный массив

Представляет собой массив, хранящий значения элементов,
связывая элементы со значением ключей, а не хранят
элементы в строгом порядке линейных индексов. Если в
массиве сохранен некоторый элемент в ассоциации с ключом,
то для последующей выборки элементов из массива
достаточно указать значение ключа.

6. Индексный (простой) и ассоциативный массивы

7. Статические и динамические массивы

Динамическим называется массив, размер которого может
меняться во время исполнения программы. Динамические
массивы дают возможность более гибкой работы с данными,
так как позволяют не прогнозировать хранимые объёмы
данных, а регулировать размер массива в соответствии с
реально необходимыми объёмами.
Обычные, не динамические массивы называют ещё
статическими.

8. Массивы в PHP

Массивы PHP позволяют хранить данные сразу нескольких
типов и автоматически организовывать эти данные от
имени пользователя с помощью широкого набора
различных средств, т.е. являются гетерогенными.
Интерпретатор PHP не делает различий между простыми
(индексируемыми) и ассоциативными массивами; не
распределяет фиксированное количество участков для
элементов массива, а создает участки по мере добавления
новых элементов к массиву (динамические массивы).

9. Массивы в PHP

Массивы PHP не требуют, чтобы все элементы относились к одному
типу, поэтому элементам массивов можно присваивать
произвольные значения PHP.
Ключи массивов могут быть только строкового (string) или
целочисленного (integer) типа, значения могут относиться к любому
типу:
$my_array[1] = “This is the second element of the array”;
$my_array[‘orange’] = 2;
$my_array[3] = false;
В результате в массиве появляются три элемента со значениями (“This
is the second element of the array”, 2, false), каждый из которых
хранится в ассоциации с определенным ключом (1, ‘orange’, 3).

10. Ключи массивов

Ключ может быть либо типа integer, либо типа string.
Ключи других типов будут приведены следующим образом:
• Строки, содержащие целое число будут преобразованы к типу integer.
Например, ключ со значением "8" будет в действительности сохранен со
значением 8. С другой стороны, значение "08" не будет преобразовано,
так как оно не является корректным десятичным целым;
• Числа с плавающей точкой (тип float) будут преобразованы к типу integer;
• Тип bool преобразуется к типу integer;
• Тип null будет преобразован к пустой строке (“”).
• Массивы (тип array) и объекты (тип object) не могут использоваться в
качестве ключей. При подобном использовании будет генерироваться
предупреждение: Недопустимый тип смещения (Illegal offset type).

11. Создание массивов

Существуют три основных способа:
1.
2.
3.
Непосредственное присваивание значения одному из
элементов массива (и тем самым неявное создание
массива);
Конструкция array(). Начиная с версии PHP 5.4 возможно
использование короткого синтаксиса [];
Вызов функции, которая возвращает массив в качестве
значения.

12. Непосредственное присваивание

Простейший способ создания массива, состоящий в выполнении с
некоторой переменной таких действий, как будто эта переменная уже
представляет собой массив:
$my_array[1] = “The first thing in my array”;
Пример массива со строковым ключом:

13. Конструкция array()

Создает новый массив элементов; в качестве параметров
принимает любое количество разделенных запятыми пар
key => value (ключ => значение). Общий синтаксис:
array(
key => value,
key2 => value2,
key3 => value3,
.
)

14. Конструкция array()

Пример создания нового массива с именем $fruit_basket:
$fruit_basket = array(‘apple’, ‘orange’, ‘banana’, ‘pear’);
Имя переменной $fruit_basket становится именем массива с
четырьмя строковыми элементами, имеющими индексы
(0,1,2,3).

15. Задание индексов с помощью конструкции array()

16. Создание массива с PHP 5.4

В версии PHP 5.4 и выше возможно использование
короткого синтаксиса объявления массива:
$arr1 = [1, 2, 3, 4];
$arr2 = ['one' => 1, 'two' => 2,
'three' => 3, 'four' => 4];
$fruit_basket = [0 => ‘apple’,
1 => ‘orange’,
2 = > ‘banana’,
3 => ‘pear’ ];

17. Некоторые функции, возвращающие массивы

Чаще всего такие функции используются при обращении к базам
данных:
Функция
mysqli_fetch_row
Назначение функции
Обрабатывает ряд результата запроса
и
возвращает
неассоциативный
массив.
mysqli_fetch_assoc Обрабатывает ряд результата запроса
и возвращает ассоциативный массив.
mysqli_fetch_array Обрабатывает ряд результата запроса,
возвращая ассоциативный массив,
численный массив или оба.

18. Пример №1:

19. Пример №2

20. Некоторые функции, возвращающие массивы

range — создает массив, содержащий диапазон элементов.
array range ( mixed $start , mixed $end [, number $step = 1 ] )
, где
• Start - первое значение последовательности.
• End - конечное значение, которым заканчивается последовательность.
• Step - если указан параметр step, то он будет использоваться как
инкремент между элементами последовательности. step должен быть
положительным числом. Если step не указан, он принимает значение по
умолчанию 1.

21. Многомерные массивы

22. Многомерные массивы

Пример многомерного массива:
$multi_array = array (‘fruit’ =>
array(‘red’ => ‘apple’,
‘orange’ => ‘orange’,
‘yellow’ = > ‘banana’,
‘green’ => ‘pear’),
‘flower’ = >
array(‘red’ => ‘rose’,
‘yellow’ = > ‘sunflower’,
‘purple’ => ‘iris’));

23. Цикл просмотра foreach

24. Функции перемещения по элементам массива

• current() – значение текущей ячейки;
• next() – значение следующей ячейки;
• prev() – значение предыдущей ячейки;
• end() – значение последней ячейки;
• reset() – значение первой ячейки.

25. Операторы для работы с массивами

Пример
Название
Результат
$a + $b
Объединение
Объединение массива $a и массива $b.
$a == $b
Равно
TRUE в случае, если $a и $b содержат одни и
те же пары ключ/значение.
$a === $b
Тождественно TRUE в случае, если $a и $b содержат одни и
те же паты ключ/значение в том же самом
равно
порядке и того же типа.
$a != $b
Не равно
TRUE, если массив $a не равен массиву $b.
$a <> $b
Не равно
TRUE, если массив $a не равен массиву $b.
$a !== $b
Тождественно TRUE, если массив $a не равен тождественно
не равно
массиву $b.

26. Пример использования операторов для работы с массивами (объединение массивов)

27. Пример использования операторов для работы с массивами (сравнение массивов)

Функция array_diff() находит расхождения в массивах
"green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result); // Array ( [1] => blue)
?>

28. Основные функции сортировки массивов

• sort – сортировка массива по возрастанию;
• rsort — сортировка массива по убыванию;
• ksort – сортировка массива по ключам по возрастанию;
• krsort — сортировка массива по ключам по убыванию;
• usort — Сортирует массив по значениям используя
• пользовательскую функцию для сравнения элементов
• uksort — Сортирует массив по ключам, используя
• пользовательскую функцию для сравнения ключей
• uasort — Сортирует массив, используя пользовательскую
• функцию для сравнения элементов с сохранением ключей
и т.п.

29. Базовые функции для работы с массивами

• count (sizeof) ()- подсчитывает количество элементов
массива;
• print_r() - выводит информацию о массиве;
• var_dump() - выводит структурированную информацию о
массиве;
• list() - присваивает переменным из списка значения
подобно массиву;
• compact() – упаковка элементов в массив;
• extract() – извлечение элементов из массива;
• unset() – удаление массива;
• другие функции, включая функции, начинающиеся с array,
например, array_combine()

30. Суперглобальные массивы (переменные)

Суперглобальные переменные (массивы) - это встроенные
переменные (массивы), которые всегда доступны во всех областях
видимости в любом месте скрипта:
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV

31. $GLOBALS

Представляет собой ассоциативный массив, содержащий
ссылки на все переменные глобальной области видимости
скрипта, определенные в данный момент.
Имена переменных являются ключами массива.

32. $_SERVER

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

33. Основные индексы $_SERVER

• 'PHP_SELF‘ - имя файла скрипта, который сейчас выполняется,
относительно корня документов;
• 'SERVER_ADDR' - IP адрес сервера, на котором выполняется
текущий скрипт;
• 'SERVER_NAME‘ - имя хоста, на котором выполняется текущий
скрипт;
• REQUEST_METHOD‘ - какой метод был использован для
запроса страницы;
• 'DOCUMENT_ROOT‘ – корневая папка документов, в которой
выполняется текущий скрипт, в точности та, которая указана в
конфигурационном файле сервера;
• 'REMOTE_ADDR' - IP-адрес, с которого пользователь
просматривает текущую страницу;
• и т.п.

34. Глобальные массивы

PHP. Работа с массивами, слайд №1
PHP. Работа с массивами, слайд №2
PHP. Работа с массивами, слайд №3
PHP. Работа с массивами, слайд №4
PHP. Работа с массивами, слайд №5
PHP. Работа с массивами, слайд №6
PHP. Работа с массивами, слайд №7
PHP. Работа с массивами, слайд №8
PHP. Работа с массивами, слайд №9
PHP. Работа с массивами, слайд №10
PHP. Работа с массивами, слайд №11
PHP. Работа с массивами, слайд №12
PHP. Работа с массивами, слайд №13
PHP. Работа с массивами, слайд №14

 PHP: работа с массивами Краткий обзор

Слайд 1

 Массивы в PHP Упорядоченное отображение, которое устанавливает соответствие между значением и ключом Значением массива может быть другой массив, что позволяет создавать сложные структуры Ключами массива могут быть либо целые числа, либо строки В одном массиве могут быть ключи разных типов Преобразование типов: Строки, содержащие целое число преобразуются к типу integer Числа типа float преобразуются к типу integer отбрасыванием дробной части Тип bool преобразуется к целому Тип null преобразуется к пустой строке “” Массивы, объекты и ресурсы не могут использоваться в качестве ключей

Слайд 2

Массивы в PHP Упорядоченное отображение, которое устанавливает соответствие между значением и ключом Значением массива может быть другой массив, что позволяет создавать сложные структуры Ключами массива могут быть либо целые числа, либо строки В одном массиве могут быть ключи разных типов Преобразование типов: Строки, содержащие целое число преобразуются к типу integer Числа типа float преобразуются к типу integer отбрасыванием дробной части Тип bool преобразуется к целому Тип null преобразуется к пустой строке “” Массивы, объекты и ресурсы не могут использоваться в качестве ключей


Слайд 3

Задание массива С помощью языковой конструкции array() $array_var = array( 1=> 1, 2=> $b, “3” => “3) С помощью прямого присвоения значения: $array_var[“key”]=5.7 Индексирование массива без ключа: $array_var = array( 5, 6, “cat”, ‘rat’); $array_var[]=“first string”; $array_var[]=“next string”; Указание части ключей: $array_var = array( 5, 6, 8=>“cat”, ‘rat’); $array_var[8]=“first string”; $array_var[]=“next string”;

 Подсчет элементов в массиве: count() int count ( array $arr [, int $mode = COUNT_NORMAL ] ) – подсчитывает число элементов в массиве Список параметров: arr – массив в котором подсчитываются элементы mode - если необязательный параметр mode установлен в COUNT_RECURSIVE (или 1), функция будет рекурсивно подсчитывать количество элементов массива с учетом вложенных Возвращает количество элементов в arr; если arr не является массивом (или объектом), будет возвращена 1, но если arr - NULL, то будет возвращён 0.

Слайд 4

Подсчет элементов в массиве: count() int count ( array $arr [, int $mode = COUNT_NORMAL ] ) – подсчитывает число элементов в массиве Список параметров: arr – массив в котором подсчитываются элементы mode - если необязательный параметр mode установлен в COUNT_RECURSIVE (или 1), функция будет рекурсивно подсчитывать количество элементов массива с учетом вложенных Возвращает количество элементов в arr; если arr не является массивом (или объектом), будет возвращена 1, но если arr - NULL, то будет возвращён 0.

 Выбор ключей массива array_keys() array array_keys ( array $input [, mixed $search_value = NULL [, bool $strict = false ]] ) - возвращает числовые и строковые ключи, содержащиеся в массиве input. Если указан необязательный параметр search_value, функция возвращает только ключи, совпадающие с этим параметром. В обратном случае, функция возвращает все ключи массива input. Список параметров ¶ input - массив, содержащий возвращаемые ключи; search_value - eсли указано, будут возвращены только ключи, содержащие данное значение; strict - определяет использование строгой проверки на равенство (===) при поиске Возвращает массив с ключами из массива input, индексированный числовыми индексами

Слайд 5

Выбор ключей массива array_keys() array array_keys ( array $input [, mixed $search_value = NULL [, bool $strict = false ]] ) - возвращает числовые и строковые ключи, содержащиеся в массиве input. Если указан необязательный параметр search_value, функция возвращает только ключи, совпадающие с этим параметром. В обратном случае, функция возвращает все ключи массива input. Список параметров ¶ input - массив, содержащий возвращаемые ключи; search_value - eсли указано, будут возвращены только ключи, содержащие данное значение; strict - определяет использование строгой проверки на равенство (===) при поиске Возвращает массив с ключами из массива input, индексированный числовыми индексами

 Выбор значений массива array_values() array array_values ( array $input ) - возвращает массив cо всеми элементами массива input, индексированный числовыми индексами Параметр - input - массив, содержащий возвращаемые значения; Возвращает массив cо всеми значениями элементов массива input, индексированный числовыми индексами.

Слайд 6

Выбор значений массива array_values() array array_values ( array $input ) - возвращает массив cо всеми элементами массива input, индексированный числовыми индексами Параметр - input - массив, содержащий возвращаемые значения; Возвращает массив cо всеми значениями элементов массива input, индексированный числовыми индексами.

 Проверка наличия искомого значения in_array() bool in_array ( mixed $val , array $target [, bool $strict = FALSE ] ) - ищет в target значение val; если strict не установлен, то при поиске будет использовано нестрогое сравнение Список параметров ¶ val -искомое значение target – массив поиска strict – флаг, требующий проверки соответствия типов параметра val и соответствующего значения массива target Если val - строка, сравнение производится с учетом регистра Возвращает TRUE, если val был найден в массиве, и FALSE в обратном случае

Слайд 7

Проверка наличия искомого значения in_array() bool in_array ( mixed $val , array $target [, bool $strict = FALSE ] ) - ищет в target значение val; если strict не установлен, то при поиске будет использовано нестрогое сравнение Список параметров ¶ val -искомое значение target – массив поиска strict – флаг, требующий проверки соответствия типов параметра val и соответствующего значения массива target Если val - строка, сравнение производится с учетом регистра Возвращает TRUE, если val был найден в массиве, и FALSE в обратном случае

 Поиск значения в массиве: array_search() mixed array_search ( mixed $val , array $target [, bool $strict = false ] ) - ищет в target значение val val - искомое значение target – массив поиска strict – флаг, требующий проверки соответствия типов параметра val и соответствующего значения массива target Возвращает ключ для val, если он был найден в массиве, иначе FALSE. Если val присутствует в target более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value.

Слайд 8

Поиск значения в массиве: array_search() mixed array_search ( mixed $val , array $target [, bool $strict = false ] ) - ищет в target значение val val - искомое значение target – массив поиска strict – флаг, требующий проверки соответствия типов параметра val и соответствующего значения массива target Возвращает ключ для val, если он был найден в массиве, иначе FALSE. Если val присутствует в target более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value.

 Сортировка массива по значениям sort() bool sort ( array &$target [, int $sort_flags = SORT_REGULAR ] ) - сортирует массив, после завершения работы функции элементы массива будут расположены в порядке возрастания. target – обрабатываемый массив sort_flags – определяет изменения поведения сортировки, используя флаги сортировки, например, SORT_REGULAR - обычное сравнение элементов (без изменения типов), SORT_NUMERIC - числовое сравнение элементов, SORT_STRING - строковое сравнение элементов и др. Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Старые индексы заменяются численными, соответствующими месту элемента в отсортированном массиве

Слайд 9

Сортировка массива по значениям sort() bool sort ( array &$target [, int $sort_flags = SORT_REGULAR ] ) - сортирует массив, после завершения работы функции элементы массива будут расположены в порядке возрастания. target – обрабатываемый массив sort_flags – определяет изменения поведения сортировки, используя флаги сортировки, например, SORT_REGULAR - обычное сравнение элементов (без изменения типов), SORT_NUMERIC - числовое сравнение элементов, SORT_STRING - строковое сравнение элементов и др. Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Старые индексы заменяются численными, соответствующими месту элемента в отсортированном массиве

 Варианты сортировки с asort(), rsort(), arsort() asort() – сохраняет индексы массива сортировки rsort() – сортировка в обратном порядке arsort() – сортировка в обратном порядке с сохранением индексов Действуют флаги сортировки

Слайд 10

Варианты сортировки с asort(), rsort(), arsort() asort() – сохраняет индексы массива сортировки rsort() – сортировка в обратном порядке arsort() – сортировка в обратном порядке с сохранением индексов Действуют флаги сортировки

 Сортировка массива по ключам ksort(), krsort() bool ksort ( array &$target [, int $sort_flags = SORT_REGULAR ] ) - сортирует массив по ключам, сохраняя отношения между ключами и значениями target – обрабатываемый массив sort_flags – флаги сортировки Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки krsort() сортирует в порядке убывания

Слайд 11

Сортировка массива по ключам ksort(), krsort() bool ksort ( array &$target [, int $sort_flags = SORT_REGULAR ] ) - сортирует массив по ключам, сохраняя отношения между ключами и значениями target – обрабатываемый массив sort_flags – флаги сортировки Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки krsort() сортирует в порядке убывания

 Работа с указателями: reset(), end(), next(), prev(), current() mixed reset ( array &$array ) - перемещает внутренний указатель array к его первому элементу и возвращает значение первого элемента массива или FALSE если массив пуст. mixed end ( array &$array ) - устанавливает внутренний указатель array на последний элемент и возвращает его значение или FALSE если массив пуст. mixed next ( array &$array ) - передвигает его внутренний указатель на одну позицию вперёд, после чего возвращает значение текущего элемента массива или FALSE, если достигнут конец массива. mixed prev ( array &$array ) - передвигает внутренний указатель массива на одну позицию назад, после чего возвращает значение текущего элемента массива или FALSE, если больше элементов нет mixed current ( array &$array ) – возвращает значение текущего элемента массива, не перемещая внутренний указатель

Слайд 12

Работа с указателями: reset(), end(), next(), prev(), current() mixed reset ( array &$array ) - перемещает внутренний указатель array к его первому элементу и возвращает значение первого элемента массива или FALSE если массив пуст. mixed end ( array &$array ) - устанавливает внутренний указатель array на последний элемент и возвращает его значение или FALSE если массив пуст. mixed next ( array &$array ) - передвигает его внутренний указатель на одну позицию вперёд, после чего возвращает значение текущего элемента массива или FALSE, если достигнут конец массива. mixed prev ( array &$array ) - передвигает внутренний указатель массива на одну позицию назад, после чего возвращает значение текущего элемента массива или FALSE, если больше элементов нет mixed current ( array &$array ) – возвращает значение текущего элемента массива, не перемещая внутренний указатель

 Работа с указателями: each(), key() array each ( array &$array ) - возвращает текущую пару ключ/значение из массива и смещает его указатель; после выполнения each(), указатель массива перемещается к следующему его элементу, пока не будет достигнут конец массива. Возвращает массив из четырех элементов, с ключами 0, 1, key и value. Элементы 0 и key содержат имя ключа элемента массива, а 1 и value содержат его данные mixed key ( array &$array ) - возвращает индекс текущего элемента массива возвращает ключ того элемента массива, на который в данный момент указывает внутренний указатель массива, не сдвигая указателя или NULL, если внутренний указатель вне границ массива или массив пуст.

Слайд 13

Работа с указателями: each(), key() array each ( array &$array ) - возвращает текущую пару ключ/значение из массива и смещает его указатель; после выполнения each(), указатель массива перемещается к следующему его элементу, пока не будет достигнут конец массива. Возвращает массив из четырех элементов, с ключами 0, 1, key и value. Элементы 0 и key содержат имя ключа элемента массива, а 1 и value содержат его данные mixed key ( array &$array ) - возвращает индекс текущего элемента массива возвращает ключ того элемента массива, на который в данный момент указывает внутренний указатель массива, не сдвигая указателя или NULL, если внутренний указатель вне границ массива или массив пуст.

 Хранение массивов: serialize () и unserialize() string serialize ( mixed $value ) - генерирует пригодное для хранения представление переменной value - значение, которое необходимо сериализовать. serialize() обрабатывает все типы, кроме resource. Возвращает строку, содержащую потоковое представление переменной value, которая может быть сохранена где угодно. mixed unserialize ( string $str ) - принимает одну сериализованную переменную и конвертирует ее обратно в переменную PHP. str – строка, полученная ранее с помощью функции serialize() Возвращает преобразованное значение, которое принимает один из типов boolean, integer, float, string, array или object. Примечание: это полезно для хранения или передачи данных между PHP скриптами без потери их типа и структуры.

Слайд 14

Хранение массивов: serialize () и unserialize() string serialize ( mixed $value ) - генерирует пригодное для хранения представление переменной value - значение, которое необходимо сериализовать. serialize() обрабатывает все типы, кроме resource. Возвращает строку, содержащую потоковое представление переменной value, которая может быть сохранена где угодно. mixed unserialize ( string $str ) - принимает одну сериализованную переменную и конвертирует ее обратно в переменную PHP. str – строка, полученная ранее с помощью функции serialize() Возвращает преобразованное значение, которое принимает один из типов boolean, integer, float, string, array или object. Примечание: это полезно для хранения или передачи данных между PHP скриптами без потери их типа и структуры.

В прошлой статье я рассказывал о переменных, теперь пойдет речь о массивах.

Что такое массивы на уровне PHP?


На уровне PHP, массив — это упорядоченный список скрещенный с мэпом. Грубо говоря, PHP смешивает эти два понятия, в итоге получается, с одной стороны, очень гибкая структура данных, с другой стороны, возможно, не самая оптимальная, точнее, как выразился Anthony Ferrara:

PHP arrays are a great one-size-fits-all data structure. But like all one-size-fits-all , jack-of-all-trades usually means master of none.



(на картине изображен HashTable с Bucket-ами, В. Васнецов)

А начнем вот с чего — попробуем замерить память и время, съедаемое на каждое вставляемое значение. Сделаем это с помощью таких скриптов:

Запускаем эти скрипты php time.php > time и php memory.php > memory , и нарисуем графики по ним, ибо данных много и смотреть на цифры долго (данные по времени были собраны много раз и выровнены, чтобы избежать лишних скачков на графике).



(по оси X — кол-во эл-тов в массиве)

Как видно, на обоих графиках есть скачки и по потребляемой памяти и по использованному времени, и эти скачки происходят в одни и те же моменты.
Дело в том, что на уровне C (да и вообще на системном уровне), не бывает массивов, с нефиксированным размером. Каждый раз, когда вы создаете массив в C, вы должны указать его размер, чтобы система знала, сколько нужно памяти на него выделить.
Тогда как это реализовано в PHP и как объянить те скачки на графике?
Когда вы создаете пустой массив, PHP создает его с определенным размером. Если вы заполняете массив и в какой-то момент достигаете и превышаете этот размер, то создается новый массив с вдвое большим размером, все элементы копируются в него и старый массив уничтожается. Вообще, это стандартный подход.

И как это реализовано?

На самом деле, для реализации массивов в PHP, используется вполне себе стандартная структура данных Hash Table, о деталях реализации которой мы и поговорим.

Hash Table хранит в себе указатель на самое первое и последнее значения (нужно для упорядочивания массивов), указатель на текущее значение (используется для итерации по массиву, это то, что возвращает current() ), кол-во элементов, представленых в массиве, массив указателей на Bucket-ы (о них далее), и еще кое-что.

Зачем
нам
ведра нужны
и куда
нам
их ложить

В Hash Table есть две главные сущности, первая — это собственно сам Hash Table, и вторая — это Bucket (далее ведро, чтобы не заскучали).

В ведрах хранятся сами значения, то есть на каждое значение — свое ведро. Но помимо этого в ведре хранится оригинал ключа, указатели на следующее и предыдущее ведра (они нужны для упорядочивания массива, ведь в PHP ключи могут идти в любом порядке, в каком вы захотите), и, опять же, еще кое-что.

Таким образом, когда вы добавляете новый элемент в массив, если такого ключа там еще нет, то под него создается новое ведро и добавляется в Hash Table.

Но что самое интересное — это как в Hash Table хранятся эти ведра.

Как было сказано выше, у HT есть некий массив указателей на ведра, при этом ведра доступны в этом массиве по некоему индексу, а этот индекс можно вычислить зная ключ ведра. Звучит немного сложно, но на самом деле, все гораздо проще чем кажется. Попробуем разобрать, как происходит получение элемента по ключу из HT:

  • Если ключ строковый — то происходит хеширование строки до integer-a (используется алгоритм хеширования DJBX33A):
    • Первоначальное значение хеша взято за магические 5381
    • На каждый символ ключа умножаем хеш на 33 и прибавляем номер символа по ASCII

    После этого попробуем добавить в Hash Table, с маской 3, элементы с ключами 54 и 90. А оба этих ключа после наложения маски будут равны двойки.

    Что делать с коллизиями?

    У ведер оказывается есть еще пара карт в рукаве. Каждое ведро имеет также указатель на предыдущее и следующее ведро, у которых индексы (хеши от ключей) равны.
    Таким образом, помимо основного двусвязного списка, который проходит между всеми ведрами, есть еще и мелкие двусвязные списки между теми ведрами, индексы которых равны. То есть получается примерно следующая картина:


    Вернемся к нашему кейсу с ключами 54 и 90, и маской 3. После того, как вы добавите 54, структура HT будет выглядеть примерно так:

    Теперь добавим элемент с ключом 90, теперь все будет выглядеть примерно так:

    Теперь давайте добавим несколько элементов до переполнения nTableSize (напомню, что переполнение будет только тогда, когда nNumOfElements > nTableSize).
    Добавим элементы с ключами 0, 1, 3 (такие, которых еще не было, и после наложения масок они останутся теми же), вот что будет:

    То, что происходит после переполнения массива, называется rehash. По сути это итерирование по всем существующим ведрам (через pListNext), назначение их соседей (коллизий) и добавление ссылок на них в arBuckets.

    • Если ключ строковый — то происходит хеширование строки до integer-a (используется алгоритм хеширования DJBX33A):
      • Первоначальное значение хеша взято за магические 5381
      • На каждый символ ключа умножаем хеш на 33 и прибавляем номер символа по ASCII

      Стоит отметить, что в PHP почти все посторено на одной этой структуре HashTable: все переменные, лежащие в каком-либо scope-е, на самом деле лежат в HT, все методы классов, все поля классов, даже сами дефинишины классов лежат в HT, это на самом деле очень гибкая структура. Помимо прочего, HT обеспечивает практически одинаковую скорость выборки/вставки/удаления и сложность всех троих является O(1), но с оговоркой на небольшой оверхед при коллизиях.

      Кстати, здесь я реализовал Hash Table в самом PHP. Ну, то есть, имплементировал PHP-шные массивы в PHP =)

      На самом деле массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хэш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стек, очередь и, возможно, что-то еще. Так как значением массива может быть другой массив PHP, можно также создавать деревья и многомерные массивы.

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

      Синтаксис

      Определение при помощи array()

      Массив (тип array ) может быть создан языковой конструкцией array() . language construct. В качестве параметров она принимает любое количество разделенных запятыми пар key => value (ключ => значение).

      Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, т.е. array(1, 2) предпочтительней array(1, 2, ). Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.

      Начиная с PHP 5.4 возможно использовать короткий синтаксис определения массивов, который заменяет языковую конструкцию array() на [].

      // Начиная с PHP 5.4
      $array = [
      "foo" => "bar" ,
      "bar" => "foo" ,
      ];
      ?>

      key может быть либо типа integer , либо типа string . value может быть любого типа.

      • Строки, содержащие целое число будут преобразованы к типу integer . Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.
      • Числа с плавающей точкой (тип float ) также будут преобразованы к типу integer , т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8.
      • Тип bool также преобразовываются к типу integer . Например, ключ со значением true будет сохранен со значением 1 и ключ со значением false будет сохранен со значением 0.
      • Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранен со значением "".
      • Массивы (тип array ) и объекты (тип object ) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).

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

      Результат выполнения данного примера:

      Так как все ключи в вышеприведенном примере преобразуются к 1, значение будет перезаписано на каждый новый элемент и останется только последнее присвоенное значение "d".

      Массивы в PHP могут содержать ключи типов integer и string одновременно, так как PHP не делает различия между индексированными и ассоциативными массивами.

      Результат выполнения данного примера:

      Параметр key является необязательным. Если он не указан, PHP будет использовать предыдущее наибольшее значение ключа типа integer , увеличенное на 1.

      Результат выполнения данного примера:

      Возможно указать ключ только для некоторых элементов и пропустить для других:

      Результат выполнения данного примера:

      Как вы видите последнее значение "d" было присвоено ключу 7. Это произошло потому, что самое большое значение ключа целого типа перед этим было 6.

      Доступ к элементам массива с помощью квадратных скобок

      Доступ к элементам массива может быть осуществлен с помощью синтаксиса arrayРеферат на тему массивы php.

      = array(
      "foo" => "bar" ,
      42 => 24 ,
      "multi" => array(
      "dimensional" => array(
      "array" => "foo"
      )
      )
      );

      var_dump ( $array [ "foo" ]);
      var_dump ( $array [ 42 ]);
      var_dump ( $array [ "multi" ][ "dimensional" ][ "array" ]);
      ?>

      Результат выполнения данного примера:

      Замечание:

      Для доступа к элементам массива могут использоваться как квадратные, так и фигурные скобки (например, $array[42] и $array означают одно и то же в вышеприведенном примере).

      С PHP 5.4 стало возможным прямое разыменование массива, возвращаемого в качестве результата вызова функции или метода. Раньше приходилось использовать временные переменные.

      С PHP 5.5 стало возможным прямое разыменование элементов у литерала массива.

      function getArray () <
      return array( 1 , 2 , 3 );
      >

      // в PHP 5.4
      $secondElement = getArray ()[ 1 ];

      // ранее делали так
      $tmp = getArray ();
      $secondElement = $tmp [ 1 ];

      // или так
      list(, $secondElement ) = getArray ();
      ?>

      Замечание:

      Попытка доступа к неопределенному ключу в массиве - это то же самое, что и попытка доступа к любой другой неопределенной переменной: будет сгенерирована ошибка уровня E_NOTICE , и результат будет NULL .

      Создание/модификация с помощью синтаксиса квадратных скобок

      Существующий массив может быть изменен явной установкой значений в нем.

      Это выполняется присвоением значений массиву array с указанием в скобках ключа. Кроме того, вы можете опустить ключ. В этом случае добавьте к имени переменной пустую пару скобок ([]).

      Если массив $arr еще не существует, он будет создан. Таким образом, это еще один способ определить массив array . Однако такой способ применять не рекомендуется, так как если переменная $arr уже содержит некоторое значение (например, значение типа string из переменной запроса), то это значение останется на месте и [] может на самом деле означать доступ к символу в строке. Лучше инициализировать переменную путем явного присваивания значения.

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

      = array( 5 => 1 , 12 => 2 );

      $arr [] = 56 ; // В этом месте скрипта это
      // то же самое, что и $arr[13] = 56;

      $arr [ "x" ] = 42 ; // Это добавляет к массиву новый
      // элемент с ключом "x"

      unset( $arr [ 5 ]); // Это удаляет элемент из массива

      unset( $arr ); // Это удаляет массив полностью
      ?>

      Замечание:

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

      Учтите, что максимальное целое значение ключа не обязательно существует в массиве в данный момент. Оно могло просто существовать в массиве какое-то время, с тех пор как он был переиндексирован в последний раз. Следующий пример это иллюстрирует:

      // Создаем простой массив.
      $array = array( 1 , 2 , 3 , 4 , 5 );
      print_r ( $array );

      // Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
      foreach ( $array as $i => $value ) unset( $array [ $i ]);
      >
      print_r ( $array );

      // Добавляем элемент (обратите внимание, что новым ключом будет 5, вместо 0).
      $array [] = 6 ;
      print_r ( $array );

      // Переиндексация:
      $array = array_values ( $array );
      $array [] = 7 ;
      print_r ( $array );
      ?>

      Результат выполнения данного примера:

      Полезные функции

      Для работы с массивами существует достаточное количество полезных функций. Смотрите раздел функции для работы с массивами.

      Замечание:

      Функция unset() позволяет удалять ключи массива. Обратите внимание, что массив НЕ будет переиндексирован. Если вы действительно хотите поведения в стиле "удалить и сдвинуть", можно переиндексировать массив используя array_values() .

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

      $b = array_values ( $a );
      // Теперь $b это array(0 => 'один', 1 => 'три')
      ?>

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

      Что можно и нельзя делать с массивами

      Почему $foo[bar] неверно?

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

      This is wrong, but it works. The reason is that this code has an undefined constant (bar) rather than a string ('bar' - notice the quotes). PHP may in the future define constants which, unfortunately for such code, have the same name. It works because PHP automatically converts a bare string (an unquoted string which does not correspond to any known symbol) into a string which contains the bare string . For instance, if there is no defined constant named bar , then PHP will substitute in the string 'bar' and use that.

      Замечание: Это не означает, что нужно всегда заключать ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это помешает PHP обрабатывать их.

      ( E_ALL );
      ini_set ( 'display_errors' , true );
      ini_set ( 'html_errors' , false );
      // Простой массив:
      $array = array( 1 , 2 );
      $count = count ( $array );
      for ( $i = 0 ; $i $count ; $i ++) echo "\nПроверяем $i : \n" ;
      echo "Плохо: " . $array [ '$i' ] . "\n" ;
      echo "Хорошо: " . $array [ $i ] . "\n" ;
      echo "Плохо: < $array [ '$i' ]>\n" ;
      echo "Хорошо: < $array [ $i ]>\n" ;
      >
      ?>

      Результат выполнения данного примера:

      Дополнительные примеры, демонстрирующие этот факт:

      // Показываем все ошибки
      error_reporting ( E_ALL );

      $arr = array( 'fruit' => 'apple' , 'veggie' => 'carrot' );

      // Верно
      print $arr [ 'fruit' ]; // apple
      print $arr [ 'veggie' ]; // carrot

      // Неверно. Это работает, но из-за неопределенной константы с
      // именем fruit также вызывает ошибку PHP уровня E_NOTICE
      //
      // Notice: Use of undefined constant fruit - assumed 'fruit' in.
      print $arr [ fruit ]; // apple

      // Давайте определим константу, чтобы продемонстрировать, что
      // происходит. Мы присвоим константе с именем fruit значение 'veggie'.
      define ( 'fruit' , 'veggie' );

      // Теперь обратите внимание на разницу
      print $arr [ 'fruit' ]; // apple
      print $arr [ fruit ]; // carrot

      // Внутри строки это нормально. Внутри строк константы не
      // рассматриваются, так что ошибки E_NOTICE здесь не произойдет
      print "Hello $arr [ fruit ] " ; // Hello apple

      // С одним исключением: фигурные скобки вокруг массивов внутри
      // строк позволяют константам там находиться
      print "Hello < $arr [ fruit ]>" ; // Hello carrot
      print "Hello < $arr [ 'fruit' ]>" ; // Hello apple

      // Это не будет работать и вызовет ошибку обработки, такую как:
      // Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
      // Это, конечно, также действует и с суперглобальными переменными в строках
      print "Hello $arr [ 'fruit']" ;
      print "Hello $_GET [ 'foo']" ;

      // Еще одна возможность - конкатенация
      print "Hello " . $arr [ 'fruit' ]; // Hello apple
      ?>

      Если вы переведете error_reporting в режим отображения ошибок уровня E_NOTICE (например, такой как E_ALL ), вы сразу увидите эти ошибки. По умолчанию error_reporting установлена их не отображать.

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

      Это пример использования возвращаемого функцией значения в качестве индекса массива. PHP известны также и константы:

      [ E_ERROR ] = "Произошла фатальная ошибка" ;
      $error_descriptions [ E_WARNING ] = "PHP сообщает о предупреждении" ;
      $error_descriptions [ E_NOTICE ] = "Это лишь неофициальное замечание" ;
      ?>

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

      [ 1 ] = "Произошла фатальная ошибка" ;
      $error_descriptions [ 2 ] = "PHP сообщает о предупреждении" ;
      $error_descriptions [ 8 ] = "Это лишь неофициальное замечание" ;
      ?>

      поскольку E_ERROR соответствует 1, и т.д.

      Так что же в этом плохого?

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

      Замечание: Повторим, внутри строки ( string ), заключенной в двойные кавычки, корректно не окружать индексы массива кавычками, поэтому "$foo[bar]" является верной записью. Более подробно почему - смотрите вышеприведенные примеры, а также раздел обработка переменных в строках.

      Преобразование в массив

      Для любого из типов: integer , float , string , boolean и resource , преобразование значения в массив дает результатом массив с одним элементом (с индексом 0), являющимся скалярным значением, с которого вы начали. Другими словами, (array)$scalarValue - это точно то же самое, что и array($scalarValue).

      Если вы преобразуете в массив объект ( object ), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: целочисленные свойства станут недоступны; к закрытым полям класса (private) спереди будет дописано имя класса; к защищенным полям класса (protected) спереди будет добавлен символ '*'. Эти добавленные значения с обоих сторон также имеют нулевые байты. Это может вызвать несколько неожиданное поведение:

      class A <
      private $A ; // Это станет '\0A\0A'
      >

      class B extends A private $A ; // Это станет '\0B\0A'
      public $AA ; // Это станет 'AA'
      >

      var_dump ((array) new B ());
      ?>

      Вышеприведенный код покажет 2 ключа с именем 'AA', хотя один из них на самом деле имеет имя '\0A\0A'.

      Если вы преобразуете в массив значение NULL , вы получите пустой массив.

      Сравнение

      Массивы можно сравнивать при помощи функции array_diff() и операторов массивов.

      Примеры

      The array type in PHP is very versatile. Here are some examples: Тип массив в PHP является очень гибким, вот несколько примеров:

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

      $b = array( 'a' , 'b' , 'c' );

      // . . .полностью соответствует
      $a = array();
      $a [ 'color' ] = 'red' ;
      $a [ 'taste' ] = 'sweet' ;
      $a [ 'shape' ] = 'round' ;
      $a [ 'name' ] = 'apple' ;
      $a [] = 4 ; // ключом будет 0

      // после выполнения этого кода, $a будет массивом
      // array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
      // 'name' => 'apple', 0 => 4), а $b будет
      // array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c').
      ?>

      // Массив как карта (свойств)
      $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 , // ключ = 0
      5 => 6 ,
      3 => 7 ,
      'a' => 4 ,
      11 , // ключ = 6 (максимальным числовым индексом было 5)
      '8' => 2 , // ключ = 8 (число!)
      '02' => 77 , // ключ = '02'
      0 => 12 // значение 10 будет перезаписано на 12
      );

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

      = array( 'red' , 'blue' , 'green' , 'yellow' );

      foreach ( $colors as $color ) echo "Вам нравится $color ?\n" ;
      >

      Результат выполнения данного примера:

      Изменение значений массива напрямую стало возможным с версии PHP 5 путем передачи их по ссылке. До этого необходим следующий обходной прием:

      // PHP 5
      foreach ( $colors as & $color ) $color = strtoupper ( $color );
      >
      unset( $color ); /* это нужно для того, чтобы последующие записи в
      $color не меняли последний элемент массива */

      // Обходной прием для старых версий
      foreach ( $colors as $key => $color ) $colors [ $key ] = strtoupper ( $color );
      >

      Результат выполнения данного примера:

      Следующий пример создает массив, начинающийся с единицы.

      Результат выполнения данного примера:

      // заполняем массив всеми элементами из директории
      $handle = opendir ( '.' );
      while ( false !== ( $file = readdir ( $handle ))) $files [] = $file ;
      >
      closedir ( $handle );
      ?>

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

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

      = array ( "фрукты" => array ( "a" => "апельсин" ,
      "b" => "банан" ,
      "c" => "яблоко"
      ),
      "числа" => array ( 1 ,
      2 ,
      3 ,
      4 ,
      5 ,
      6
      ),
      "дырки" => array ( "первая" ,
      5 => "вторая" ,
      "третья"
      )
      );

      // Несколько примеров доступа к значениям предыдущего массива
      echo $fruits [ "дырки" ][ 5 ]; // напечатает "вторая"
      echo $fruits [ "фрукты" ][ "a" ]; // напечатает "апельсин"
      unset( $fruits [ "дырки" ][ 0 ]); // удалит "первая"

      // Создаст новый многомерный массив
      $juices [ "apple" ][ "green" ] = "good" ;
      ?>

      Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы скопировать массив по ссылке, вам нужно использовать оператор ссылки.

      = array( 2 , 3 );
      $arr2 = $arr1 ;
      $arr2 [] = 4 ; // $arr2 изменился,
      // $arr1 все еще array(2, 3)

      $arr3 = & $arr1 ;
      $arr3 [] = 4 ; // теперь $arr1 и $arr3 одинаковы
      ?>

      Читайте также: