Массивы
Массив — это нумерованный набор переменных. Другими словами массив это большая переменная, которая содержит в себе много других переменных. Где их используют? Их удобно использовать при группировке данных. Переменная в массиве называется элементом массива, а ее позиция задется индексом. Общее число элементов в массиве называется размером массива.
Нумерация элементов массива начинается с нуля.
Массивы, индексом которых являются числа, часто называют списками.
Пример списка:
1 2 3 4 |
$Mass[ ] = 'один'; $Mass[ ] = 'два'; $Mass[ ] = 'три'; $Mass[ ] = 'четыре'; |
Ассоциативные массивы
Главное отличие ассоциативных массивов от списков — возможность обращения к элементу массива не по числовому индексу, а по индексу, представляющему собой строку(ассоциацию). Индексы ассоциативного массива называются ключами. Пример ассоциативного массива:
1 2 3 4 5 6 7 |
$week = array('Понедельник' => '1', 'Вторник' => '2', 'Среда' => '3', 'Четверг' => '4', 'Пятница' => '5', 'Суббота' => '6', 'Воскресение' => '7',); |
Инициализация массива
Массив можно инициализировать поэлементно:
1 2 3 4 |
$Mass[ ] = 'name'; $Mass[ ] = 'sname'; $Mass[ ] = 'phone'; $Mass[ ] = 'email'; |
Операция [] всегда добавляет элемент в конец массива, присваивая ему при этом такой числовой индекс, который бы не конфликтовал с уже имеющимися в массиве(т.е. выбирается номер, превосходящий все имеющиеся цифровые ключи в массиве).
Кроме этого можно воспользоваться инструкцией list() — она позволяет присваивать переменным значения элементов массива:
1 |
list ($name, $surname, $phone) = $Mass; |
Данную конструкцию можно использовать для любого количества переменных: если в массиве не хватит элементов, чтобы их заполнить им присвоятся неопределенные значения.
Существует еще один способ инициализации функции array():
1 |
$Mass = array('name', 'sname', 'phone', 'email'); |
Ддя ассоциативного массива:
1 |
$Mass = array('name'=> 'Иван', 'sname'=>'Иванович', 'phone'=>'89092551235', 'email'=>'ivanov@mail.ru'); |
Можно использовать сокращенную запись:
1 |
$Mass = ['name', 'sname', 'phone', 'email']; |
Массивы на экран выводятся оператором print_r(). С его помощью выведем содержание массива $Mass на экран следующим образом:
1 |
print_r($Mass); |
Должно получиться:
1 |
Array ( [0] = name [1] = sname [2] = phone [3] = email ) |
Давайте разберемся что же все это значит. Array — это обозначение типа данных т.е. в нашем случае массива. Далее выводятся все 5 элементов заложенные нами в этот массив. Цифры в квадратных скобках — это ключи каждого элемента массива или можно сказать нумерация элементов массива. При инициализации массива можно сразу же указать индексы элементов( и вовсе не обязательно соблюдать порядок нумерации):
1 2 3 4 |
$Mass[1] = 'name'; $Mass[3] = 'sname'; $Mass[9] = 'phone'; $Mass[82] = 'email'; |
Если же индекс не указывать(как показано в предыдущем примере) то, PHP автоматически присвоит элементу индекс, на единицу больше последнего, т.е. добавит элемент в конец массива.
Обратите внимание, в массиве никогда не может быть двух элементов с одинаковыми ключами, потому что все операции, применимые к массивам, всегда контролируют, чтобы этого не произошло.
Получение и изменение элемента массива
Обращение к элементам массива осуществляется с помощью квадратных скобок, в которых указывается индекс элемента.
1 2 3 4 5 6 |
$Mass[1] = 'name'; $Mass[3] = 'sname'; $Mass[9] = 'phone'; $Mass[82] = 'email'; echo $Mass[3]; |
Для того, чтобы добавить массиву еще один элемент, нужно просто указать его индекс и значение в конце списка элементов массива. Если индекс/ключ не указан, PHP автоматически выберет наименьший незанятый числовой индекс.
Получить число элементов массива можно с помощью функции count():
1 |
echo count($Mass); //выведет 4 |
Многомерные массивы
Любому элементу массива можно присвоить другой массив. Инициализация многомерного массива происходит точно так же как и обычного с помощью функции array(). Для создания многомерных массивов наиболее удобны ассоциативные.
1 2 3 4 5 6 |
$baza = array( 'Иванов' => array('Имя'=>'Иван', 'Отчество'=>'Иванович', 'Год рождения'=>'1980'), 'Петров' => array('Имя'=>'Семен', 'Отчество'=>'Семенович', 'Год рождения'=>'1985') ) |
Доступ к элементу такого массива осуществляется путем указания двух ключей:
1 |
echo $baza['Иванов']['Год рождения']; |
После этого на экране увидим цифру 1980.
Слияние массивов
Для слияния двух ассоциативных массивов предусмотрен оператор +:
1 2 3 4 5 6 7 8 |
$Ket['kat1']='перс'; $Ket['kat2']='сиам'; $Dog['dog1']='питбуль'; $Dog['dog2']='мастиф'; $Animals = $Ket + $Dog; print_r($Animals); //выведет массив |
В этом примере массив $Animals будет содержать все элементы массивов $Ket и $Dog.Причем порядок следования элементов будет зависеть от порядка, в котором массивы сливаются. Так проявляется направленность массивов, она заставляет оператор + стать некоммутативным, т.е. $Ket + $Dog не равно $Dog + $Ket.
Для слияния двух списков такой способ не подходит. При слиянии массивов с некоторыми одинаковыми элементами(ключами) в результирующем массиве останется только один элемент с таким же ключом — тот, который был в первом массиве, и на том же самом месте. Поэтому, для списков используется функция array_merge():
1 2 3 4 5 6 7 |
$Mass1[ ] = 'name'; $Mass1[ ] = 'sname'; $Mass2[ ] = 'phone'; $Mass2[ ] = 'email'; $Mass3= array_merge($Mass1, $Mass2); print_r($Mass3); //выведет массив |
Теперь массив $Mass3 содержит все элементы массивов $Mass1 и $Mass2.
Если один из параметров в функции array_merge() не является массивом, интерпретатор выведет сообщение об ошибке.
Перебор массива
Довольно часто при написании сценариев, приходится перебирать все элементы некоторого массива. Если массив список то его элементы можно перебрать с помощью функции count() и цикла for:
1 2 3 |
($i=0; $i<count($mass); $i++) echo $mass[$i]; |
С ассоциативным массивом все немного сложнее. Рассмотрим пример:
1 2 3 4 5 6 7 8 |
$base = array( "Petrov Ivan" => "1989-03-20", "Sidorov Semen" =>"1990-09-09", ); for (reset($base); ($k=key($base)); next($base)) echo "$k родился {$base[$k]}<br>"; |
В массивах есть такое понятие как текущий элемент. Функция reset() просто устанавливает этот элемент на первую позицию в массиве. Функция key() возвращает ключ, который имеет текущий элемент. Функция next() перемещает текущий элемент на одну позицию вперед.
Помимо своей основной задачи, функции reset() и next(), возвращают некоторые значения:
- reset() — возвращает значение первого элемента массива (false если массив пуст);
- next() — возвращает значение элемента, следующего за текущим (fals если такого элемента нет).
Такой вид перебора массива, когда сначала вычисляется очередной ключ, а уж затем по нему косвенно находится значение элемента массива, называется косвенным. У такого вида перебора имеются свои недостатки:
- Вложенные циклы. Нельзя перебирать массив в двух вложенных циклах, так как второй вложенный цикл for «испортит» положение текущего элемента у первого цикла.
- Нулевой ключ.Если в массиве встретится нулевой ключ, то наш цикл вообще не отработает ни одного раза.
Гораздо удобнее использовать метод прямого перебора. Суть метода заключается в том, чтобы сразу на каждом «витке» цикла одновременно получать и ключ, и значение текущего элемента. Не будем описывать устаревший способ перебора с помощью функции each() и перейдем к foreach.
Перебор циклом foreach
Данный цикл разработан специально для перебора массивов. Вот как с помощью ее можно перебрать и распечатать массив:
1 |
foreach ($base) as $k =>$v) echo '$k родился $v'; |
Подробнее ознакомиться с механизмом работы данного цикла можно в статье о циклах.
Функция explode() и implode()
Данные функции часто используют при работе с массивами.
- explode() — служит для разбиения какой-либо строки на более мелкие части (например, эти части разделяются в строке спецсимволом)
- implode() — служит слияния нескольких небольших строк в одну большую, причем не впритык, а вставляя между ними разделитель
Синтаксис explode():
1 |
list explode(string $token, string $Str [, int $limit]) |
Функция получает строку, заданную в ее втором аргументе, и пытается найти в ней подстроки, равные первому аргументу. Затем по месту вхождения этих подстрок строка «разрезается» на части, помещаемые в массив-список, который возвращается в результате. Если задан параметр $limit, то учитываются только первые($limit-1) участков «разреза». Таким образом, возвращается список из не более чем $limit элементов. Это позволяет нам проигнорировать возможное наличие разделителя в тексте последнего поля, если мы знаем, что всего полей, скажем, 6. Вот пример:
1 2 3 4 |
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; $pieces = explode(" ", $pizza); echo $pieces[0]; // piece1 echo $pieces[1]; // piece2 |
Строкой разбиения может быть не только один символ, но и небольшая строка.
Синтаксис implode():
1 |
string implode(string $glue, list $List) |
Она получает ассоциативный массив $List, заданный во втором параметре, и «склеивают» его значения при помощи «строки-клея» $glue из первого параметра. Вместо списка во втором аргументе можно передавать любой ассоциативный массив — в этом случае будут рассматриваться только его значения.