PHP-массив: функции и значение

0
0

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

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

Что такое PHP-массив?

php массив

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

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

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

многомерный массив php

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

В действительности же для того чтобы реализовать PHP-массив, применяется традиционная структура данных под названием Hash Table. Даная структура включает в себя указатель на последнее и первое значение, что является необходимым для упорядочивания массивов, а также указатель на текущее значение, который применяется для того, чтобы обеспечить итерацию по массиву. Помимо этого в Hash Table содержится количество элементов, хранящихся в массиве, массив указателей на Bucket и другие важные данные.

Почему Hash Table?

php сортировка массива

Hash Table имеет две важные особенности – это непосредственно сама структура данных, а также Bucket (ведро).

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

Таким образом, если вы хотите добавить в массив какой-нибудь новый элемент, а данного ключа там еще нет, под него будет автоматически создано новое ведро, которое будет добавлено в Hash Table. И в данном случае нужно правильно понимать, как многомерный массив PHP будет хранить эти ведра.

Как получить ключ?

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

  • если ключ является строковым, то в таком случае осуществляется хеширование строки вплоть до integer;
  • на полученный ключ накладывается маска, которая является равной размеру массива минус 1;
  • в конечном итоге данный ключ может использоваться в качестве индекса для того, чтобы определить нужный указатель на ведро из массива.

О маске: к примеру, в массиве данных содержится четыре различных элемента, тогда маска будет равна трем. Теперь, если в качестве ключа у вас получается число наподобие 123, то в таком случае после наложения маски будет получено 3, и данное число уже может использоваться в качестве индекса.

Как поступить с коллизиями?

php вывод массива

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

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

Как получить элемент по ключу?

php элемент массива

Процедура является изначально такой же, как и в случае с получением ключа, но в данном случае есть продолжение:

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

Такие действия нужно повторять вплоть до того, пока в pNext полностью не закончатся ведра или же пока вы не найдете интересующее вас совпадение.

Стоит отметить, что многомерный массив PHP практически полностью построен на единственной структуре HashTable, так как все переменные, которые находятся в том или ином scope, в действительности же находятся именно в этой структуре данных, рвано как методы, поля и дефинишины классов. Помимо всего прочего данная структура данных позволяет добиться практически одинаковой скорости проведения всех операций и при этом делает их гораздо более простыми в исполнении.

Определение через array

php удалить массив

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

Ключ в данном случае может быть string или же integer. Если ключ представляет собой стандартное исполнение integer, то в таком случае он так и будет интерпретироваться, в то время как float будет обрезаться до данного формата. Стоит отметить, что в PHP сортировка массива не предусматривает никакой разницы между ассоциативными и индексными массивами, то есть существует единственный тип хранилища, в котором содержатся как строковые, так и числовые индексы.

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

php значение в массиве

Для нормальной работы с массивами предусматривается достаточно большое количество различных функций, однако не все их знают и умеют ими пользоваться. В частности, отдельное внимание следует уделить такой функции, как unset, позволяющей полностью удалять ключи, которые имеет в PHP элемент массива. Если же вы хотите осуществить действие в стиле «удалить и сдвинуть», то в таком случае может быть проведена переиндексация массива через array_values.

Управляющая конструкция foreach специально создавалась для работы с массивами. Данная функция используется для того, чтобы предельно просто просмотреть содержимое массива и взаимодействовать с данными.

Команды

При объявлении индексируемого РНР-массива после того, как будет установлено имя переменной, устанавливается также пара квадратных скобок, в которых указывается непосредственно позиция данного массива. Также существует несколько основных команд, которые нужно знать при создании данного массива:

  • Array. Данная функция получает ноль или же больше элементов, после чего полностью возвращает массив, который составляется из таких элементов.
  • List. Данная конструкция является несколько похожей на array, однако ее основным предназначением является одновременное присваивание различных значений, которые извлекаются из массива, одновременно к нескольким переменным.
  • Range. Эта конструкция обеспечивает быстрое и простое создание массива целых чисел из интервала, который определяется нижней и верхней границами. Данная команда полностью возвращает массив, составленный из целых чисел указанного интервала.
  • Array_chunk. Разделяет массив на несколько отрезков.

Как можно использовать такие массивы?

В любом случае строковый литерал должен заключаться в кавычки в индексе ассоциативного массива. Достаточно часто можно встретить в старых скриптах синтаксис, в котором кавычки отсутствуют, и это действительно может работать, хотя и является неверным. В данном случае причина заключается в том, что данный код содержит в себе вместо строки неопределенную константу, вследствие чего в PHP вывод массива может быть таким, что «голая строка» автоматически может быть преобразована в полноценную строку, имеющую соответствующее значение. Другими словами, если изначально не было возможности определить установленную константу, то в таком случае PHP самостоятельно добавит кавычки, после чего использует введенную строку правильно.

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

Чем это грозит?

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

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

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

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

  • вы потеряете доступ к целочисленным свойствам;
  • впереди каждого закрытого поля класса будет приписано имя;
  • защищенные поля класса впереди имеют приписанный символ.

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

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