🧙Конкурс сказок!
Уроки PHP
(OFF) gjm2mjg (B) 21 апр 2018

Массивы

Подмечу сразу: для ознакомления с данной темой Вам нужно быть компетентным в теме Переменных, иначе разговор будет "ни о чем"!!!
Компетентны?! Приступаем! Иначе смотрим соседнюю тему в этом форуме! ;-)
=====
Итак, что же такое Массив? Для большего понимания давайте рассмотрим такую простенькую аналогию переменной с реальной жизнью: как Вам известно, переменная состоит из Имени и хранимого в ней Значения. Как большой любитель чтения предлагаю представить переменную в виде книжной страницы (именно страницы, а не листа, ибо на одном листе две страницы - для нашей аналогии это не подходит)! - В таком случае данные переменной - это содержимое книжной страницы, а её имя - это номер страницы, по которому можно однозначно обратиться конкретно к ней. Согласны!? :-) Теперь, раз уж переменная - это как книжная страница, тогда массив - это как, собственно сама книга, и её имя - это имя массива. Так же как книга под одним своим именем хранит множество пронумерованных страниц с собственным содержимым - так же и массив хранит под одним своим именем множество переменных с собственными данными. Вот именно этой возможностью одновременно хранить в одном месте несколько значений массив и отличается от обычной переменной, и вместе с этим предоставляет нам многие удобства для манипуляций с данными, о которых мы и поговорим в этой статье :-)

Опуская тонкие технические детали скажу так: работа программы заключается в выполнении определенных операций над данными (к примеру всё то, что происходит в ЭВМ (Ваш ПК, смартфон и т.д.) - это результаты огромного множества расчетов Центральным Процессором не менее огромной кучи математики над данными в виде нулей и единиц), и вот по ходу этой работы ей необходимо где-то хранить свои рабочие данные. Вы же помните как в школе на математике решали примеры "в столбик" и как при переносе числа в соседний разряд говорили нечто вроде "...в уме" - вот именно так же и у программы по ходу работы возникают ситуации когда некоторые данные понадобятся в дальнейших расчетах, а пока что их нужно сохранить "в уме" - то есть в оперативной памяти. Для использования этой возможности ЯП предлагают программисту специальный инструмент - Переменные! Но переменная пусть даже и предоставляет программисту возможность сохранить в памяти практически любое значение, её всего один-единственный недостаток не позволяет ей в полной мере удовлетворить все потребности программиста в вопросах временного хранения данных, потому что хранить это самое значение переменная способна только одно-единственное!

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

<?php

/* Возраст неких пользователей... */
$age1 = 18; // 'user1'
$age2 = 25; // 'user2'
$age3 = 21; // 'user3'
Наши данные сохранены в переменные и теперь при необходимости получить возраст любого из пользователей достаточно просто сослаться на переменную и она предоставит своё значение. Всё просто, не правда ли!? :-) Но порадоваться нам не придется вовсе, ибо в таком случае оперировать сохраненными данными возможно только зная эти переменные "в лицо" - то есть только точно зная какому имени пользователя какая переменная соответствует! Например, мы точно знаем, что возраст пользователя 'user2' хранится в переменной $age2 и при необходимости можем получить её значение, но тут уже вот прямо сразу проявляются серьезные недостатки такого подхода: Упомянутое выше знание переменной "в лицо" в данном случае не только очень неудобно, оно еще и ограничивает наши возможности исключая хоть какую-то динамику. Например, как мы при внезапной необходимости обрабатывать еще одного пользователя создадим новую переменную для хранения его возраста!?? Очень хорошо когда мы еще на этапе выполнения программы можем заранее знать точное количество таких пользователей и благодаря чему можем создать и использовать необходимые переменные, но в реальной работе такого почти не бывает - все рабочие данные не статические - по ходу выполнения кода они постоянно поступают/исчезают/изменяются и обработка их по приведенной выше схеме с переменными нам совсем не подходит!

* Достаточно опытные программисты сейчас могут быть рады "подловить" меня на том, что реализовать эту динамику всё же возможно, причем даже без использования массивов, на что я спешу ответить следующее: Да, реализовать это таки возможно, но...даже не смотря то, что для этого необходимы достаточные навыки в программировании (в частности на этом нашем PHP) - это всё не что иное, как самое настоящее извращение, ценность которого не более чем получение нового опыта просто из спортивного интереса (в очередной раз убедиться в своей крутости) и которое в реальной работе не будет использовать даже самый ярый маньяк/извращенец. Опуская некоторые технические детали и упрощая и без того простые моменты я делаю это не столько потому что сам чего-то не знаю, сколько потому, что статья пишется для новичков, которым подобные "приемы высшего пилотажа" не просто не нужны - они даже не понятны, не говоря об их использовании по ходу обучения! Так что продвинутых в программировании читателей прошу не придираться в подобных моментах, кои еще встретятся далее! :-)

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

Для начала давайте создадим пустой массив:

<?php

/* Создаем пустой массив */
$list = array();
Теперь $list - это уже не та переменная, к которым мы привыкли! В отличие от обычных она теперь может хранить более одного значения, для демонстрации чего взгляните на следующий пример, в котором в массив помещаются возрасты всех трех неких пользователей, которые ранее (при попытке решить задачу без использования массива) хранились по-отдельности в разных переменных:

<?php

/* Создаём массив и заполняем его */
$list = array(18, 25, 21);
Теперь переменная-массив $list хранит сразу три значения одновременно, к которым мы можем обращаться так же просто, как и к обычным переменным, за исключением единственной детали - помимо имени массива необходимо указать номер его необходимой нам ячейки! Давайте вспомним приведенную в начале статьи аналогию массива с книгой: так же, как мы выбираем необходимую книгу по её имени и затем находим в ней конкретную страницу по её номеру - точно так же мы можем работать с конкретной ячейкой массива, указав её номер после имени массива:

<?php

/* Создаём массив и заполняем его */
$list = array(18, 25, 21);

/* Выводим на страницу значения конкретных ячеек */
echo $list[0] . '<br>'; // 18
echo $list[2] . '<br>'; // 21
Как видите, мы указываем имя массива как и имя обычной переменной, только следом за именем в квадратных скобках (обязательно без пробела между левой скобкой и именем переменной-массива) указываем номер необходимой нам ячейки, который называется Индексом Массива. Для большей наглядности привожу структуру этого нашего массива:

<?php

$list[0]; // 18
[1]; // 25
[2]; // 21
Этот код ничего не делает и тег программного кода я использовал исключительно для правильного форматирования кода с целью облегчения визуального его восприятия!!!
Как видите, у массива $list есть три ячейки с собственными, независимыми друг от друга данными. Обязательно поэкспериментируйте в работе над индексами - например, поочередно вывести данные разных ячеек представленного выше тестового массива - Вам понравится! :-)

Прежде чем продолжать знакомство с массивами я хотел бы приостановиться и рассказать вот о чем. В приведенных выше примерах для создания массива мы использовали конструкцию ЯП PHP - array() - которая уже несколько лет и несколько версий PHP как считается устаревшей, и на смену ей пришла новая, гораздо более удобная конструкция: [ ] (квадратные скобки). Конечно, в интересах обратной совместимости (это чтобы уже написанный код продолжал работать в новых версиях ЯП PHP) array() осталась, но использовать её не рекомендуется во-первых потому что она менее удобна, чем новая; во-вторых в последних версиях PHP (начиная с 5.x, и особенно в 7.x) разработчики PHP как никогда взялись за чистку интерпретатора от устаревших конструкций и прочего уже не актуального сегодня хлама, и не исключено, что когда-то в будущих версиях PHP конструкция array() будет из него исключена и тогда старый, использующий её код, перестанет работать ссылаясь на непонимание чего от него хотят при вызове array() и тогда потребуется редактирование всего кода с целью замены всех старых array() на новый лад - на квадратные скобки! Напоследок привожу новую версию приведенного выше кода и с этих пор во всех последующих примерах для создания массива я буду использовать новую конструкцию, что и Вам советую!

<?php

/* Создаём массив и заполняем его */
$list = [18, 25, 21];

/* Выводим на страницу значение ячейки */
echo $list[0]; // 18
Теперь давайте ненадолго вернемся к индексам. При создании массива мы указывали только помещаемые в него данные, ничего не говоря о их нумерации (расположении) - во-первых такой массив (с числовыми индексами) называется Список (отсюда и название переменной $list - список с английского!); во-вторых - да, PHP как и многие другие ЯП поддерживает такой формат создания массива и нумерацию ячеек берет на себя, нумеруя их последовательно, и...; в-третьих: ...обратите внимание на то, что нумерация ячеек начинается по правилам ненавистной Вам математики - с нуля - взгляните на примеры кода еще раз! :-) И конечно, мы запросто можем повлиять на нумерацию ячеек массива, для чего существует расширенный вариант создания массива (точнее его заполнения):

<?php

$list[2 => 18,
3 => 25,
5 => 21];
Здесь отступы тоже не обязательны и используются исключительно для облегчения визуального восприятия кода. В этом коде мы уже вручную указываем и сохраняемые данные, и индексы, под которыми они будут сохранены. Причем указываемые нами индексы могут быть почти любыми и не обязательно должны быть последовательными, что здесь и продемонстрировано. И, как Вы понимаете, теперь для обращения к ячейкам массива нужно указывать именно те индексы, которые мы указали при создании массива или которые были установлены PHP самостоятельно при добавлении в массив нового элемента, иначе он (PHP) выдаст ошибку об отсутствии указанного индекса, что по своей сути абсолютно то же, что и попытка воспользоваться несуществующей переменной.

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

<?php

/* Создаем массив с несколькими значениями. */
$list = [18, 25, 21]; // Обратите внимание, что здесь произойдет автоматическая нумерация ячеек 0-2

/* Добавляем
Навигация (1/3): далее >
Статья была полезной?
· Да, наконец-то разобрался с темой 0% (0)
· Да, узнал немного нового 0% (0)
· Да, но не узнал ничего нового 0% (0)
· Нет 0% (0)
· Нет, объясняется не достаточно понятно 0% (0)
· Нет, написано плохо 0% (0)
· Нет, написано очень плохо 0% (0)
· "Сколько сейчас градусов ниже нуля?" 0% (0)
Опрос закрыт.

Комментарии (0)

Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
Уроки PHP
Повелители стихий
Первая коллекционная карточная игра с уникальной...
Тема: Светлая | Тёмная
Версия: Mobile | Lite | Touch | Доступно в Google Play