Урок 2. Массивы в PHP
Теория
В программировании очень часто возникает задача хранения списка похожих значений, например, всех дней недели или всех месяцев. Можно было бы создавать под каждое значение списка свою переменную, но это очень неудобно и долго (для списка дней недели понадобилось бы 7 переменных, а для месяцев - 12).
А теперь представьте, что вам нужно вывести на экран название 3-го месяца. С помощью 12 различных переменных это было бы проблематично, так как вам необходимо помнить названия всех переменных, в которые вы записали имена месяцев. Поэтому для таких вещей был изобретен специальный тип данных. Он называется массив.
Массив создается с помощью функции []:
<?$a=[]/*создаем массив $a*/?>
Пока созданный нами массив не содержит никаких данных. Заполним его названиями дней недели (для краткости пишем 2 буквы каждого дня):
<?$a=['пн','вт','ср','чт','пт','сб','вс']?>
Каждое значение списка, который мы записали в массив (в нашем случае каждый день недели), называется элементом массива.
Элементы разделяются между собой запятой. После этой запятой можно ставить пробелы, а можно и не ставить.
Обратите внимание на то, что названия дней недели представляют собой строки и поэтому взяты в кавычки. Кроме строк в массиве можно хранить числа (они в кавычки мы не берутся):
<?//В массиве можно хранить как строки, так и числа:
$a=['пн',256,'ср',34,38,'сб',95]?>
Посмотреть содержимое массива с помощью echo мы, не сможем:
<?//Пробуем вывести с помощью echo содержимое массива $a:
$a=['пн','вт','ср','чт','пт','сб','вс'];echo$a?>
На экране вместо содержимого массива видим слово Array.
Для того, чтобы PHP вывел нам все элементы массива, нужно воспользоваться функцией var_dump:
<?//Пробуем вывести с помощью var_dump содержимое массива $a:
$a=['пн','вт','ср','чт','пт','сб','вс'];var_dump($a)?>
Вот теперь мы действительно увидим все элементы нашего массива.
Для того, чтобы узнать, какие именно элементы хранятся в массиве, мы должны пользоваться функцией var_dump, а не echo.
Как вывести отдельный элемент массива
Итак, массив месяцев мы составили и даже научились смотреть на него функцией var_dump. Однако, полезного пока мало, так как var_dump используется для отладки кода и выводит весь массив целиком.
Предположим, мы хотим вывести на экран среду.
Делается это так: нужно после переменной массива (в нашем случае $a) написать квадратные скобки [], а в них указать порядковый номер элемента, который мы хотим вывести: $a[3]. Казалось бы, что порядковый номер среды - это 3, но это не так. Потому что в программировании нумерация начинается с 0. Поэтому 0 - это понедельник, 1 - это вторник, а 2 - это среда.
Посмотрите и повторите пример:
<?//Выведем слово ср:
$a=['пн','вт','ср','чт','пт','сб','вс'];echo$a[2]?>
Ассоциативный массив
Чтобы обратиться к нужному элементу массива, мы писали в квадратных скобках его порядковый номер (нумерация начинается с 0). Эти порядковые номера называются ключами массива. Т.е. мы получали значение элемента массива по его ключу.
В нашем случае PHP сам определял ключи для элементов (это были их порядковые номера). Иногда это может оказаться неудобным (мы хотим вывести на экран название 3-го дня недели (среду), а должны писать в квадратных скобках цифру 2). Поэтому в PHP можно указать ключи в явном виде - так, как нам нужно. Сделаем так, чтобы понедельник имел ключ 1, а не 0, как было раньше (и всем остальным дням прибавим 1):
<?//Укажем ключи в явном виде: $a=[1=>'пн',2=>'вт',3=>'ср',4=>'чт',5=>'пт',6=>'сб',7=>'вс']; echo$a[1]//выведет пн ?>
Синтаксис здесь такой: ключ, затем идет стрелка =>, а потом значение.
Ключи не обязательно должны быть числами, они могут быть и строками. Сделаем массив, в котором ключами будут имена работников, а элементами - их зарплаты:
<?//Массив работников:
$a=['Коля'=>200,'Вася'=>300,'Петя'=>400]?>
Узнаем зарплату Васи:
<? $a=['Коля'=>200,'Вася'=>300,'Петя'=>400]; echo$a['Вася']//выведет 300 ?>
Массивы, у которых явно указаны ключи, называются ассоциативными.
Хитрость с ключами
Когда мы делали ассоциативный массив дней недели, нам приходилось расставлять все ключи вручную. И все для того, чтобы нумерация началась не с 0, а с 1. Это было немного неудобно.
На самом деле нет необходимости расставлять ключи всем элементам - достаточно только 1-му элементу поставить ключ 1. Если у 2-го элемента не будет ключа, PHP поставит его автоматически, причем следующий по порядку. А следующим номером будет число 2, так как предыдущий элемент имел ключ 1 (неважно, что мы сами его поставили, а не PHP автоматически).
Исправим наш массив:
<?//Укажем ключи в явном виде: $a=[1=>'пн','вт','ср','чт','пт','сб','вс']; echo$a[3]//выведет ср ?>
Итак, этот массив с 1 нашим ключом фактически будет таким же, как и массив со всеми ключами, но сделать его проще - ключ ставится только 1-му элементу, а не всем.
Как еще можно создать массив
Объявление массива с помощью команды [] не является единственным способом его создания. Можно просто присвоить значения элементам массива, не объявляя его через array (PHP нас поймет и сам создаст массив):
<?//Можно не писать [], а просто присвоить значения его элементам: $a[0]=1; $a[1]=2; $a[2]=3; var_dump($a)//с помощью var_dump убеждаемся в том, что $a - это массив ?>
Естественно, ключи могут быть не только числовыми, но и текстовыми:
<?//Ключи могут быть строками: $a['Коля']=100; $a['Вася']=200; $a['Петя']=300; var_dump($a)//с помощью var_dump убеждаемся в том, что $a - это массив ?>
Кроме того, можно сделать так, что PHP сам добавит ключи (начиная с 0 и так далее). Для этого мы оставим квадратные скобки пустыми: $a[]=1, а PHP сам добавит ключ. Пример:
<?//Мы не пишем ключи в квадратных скобках $a[]=100;//100 будет иметь ключ 0 $a[]=200;//200 будет иметь ключ 1 $a[]=300;//300 будет иметь ключ 2 var_dump($a)//массив $a будет иметь вид [0=>100,1=>200,2=>300] ?>
Все способы создания массива
Итак, повторим все способы создания массива:
<?//Можно просто его объявить: $a=[]; //Можно его сразу и заполнить: $a=[1,2,3]; //Можно не писать [], а просто присвоить значения его элементам: $a[0]=1; $a[1]=2; $a[2]=3; //Можно даже не писать ключи, тогда PHP добавит их автоматически, начиная с 0: $a[]=1; $a[]=2; $a[]=3 ?>
Многомерный массив
Элементы массива могут быть не только строками и числами, но и массивами. Т.е. у нас получится массив массивов или многомерный массив.
Давайте сделаем массив студентов $students, который будет содержать 2 подмассива: студенты мужского пола и женского:
<?//Многомерный массив студентов:
$a=['boys'=>['Коля','Вася','Петя'],'girls'=>['Даша','Маша','Лена']]?>
Чтобы вывести какой-либо элемент из многомерного массива следует писать уже не 1 пару [], а 2: $a['boys'][0] - так мы выведем 'Коля'.
Практика
Примеры решения задач
Задача
Дан массив с элементами 'Привет, ', 'мир' и '!'. Необходимо вывести на экран фразу 'Привет, мир!'.
Решение:
<?/*Выведем фразу 'Привет, мир!'*/$a=['Привет, ','мир','!'];echo$a[0].$a[1].$a[2]?>
Привет, мир!
Разберем это решение.
Слово 'Привет, ' хранится под номером 0, это значит, что для доступа к нему мы должны написать $a[0].
Для доступа к слову 'мир' мы должны написать $a[1], а $a[2] содержит в себе '!'. Далее с помощью оператора 'точка' мы сложим 3 наши строки ('Привет, ', 'мир' и '!') в 1 строку таким образом: $a[0].$a[1].$a[2], и выведем на экран с помощью echo.
Задача
Решим немного другую задачу: дан массив с элементами 'Привет, ', 'мир' и '!'. Необходимо записать в переменную $text фразу 'Привет, мир!', а затем вывести на экран содержимое этой переменной.
Решение:
<?$a=['Привет, ','мир','!'];$t=$a[0].$a[1].$a[2];/*В переменной $t теперь лежит строка 'Привет, мир!'. Выведем ее на экран:*/echo$t?>
Привет, мир!
Задача
Дан массив ['Привет, ','мир','!']. Необходимо записать в 1-й элемент (т.е. элемент с номером 0) этого массива слово 'Пока, ' (т.е. вместо слова 'Привет, ' будет 'Пока, ').
Решение:
<?$a=['Привет, ','мир','!']; $a[0]='Пока, ';//Перезапишем 1-й элемент массива var_dump($a);//Посмотрим на массив и убедимся в том, что он изменился ?>
array(3) { [0]=> string(10) "Пока, " [1]=> string(6) "мир" [2]=> string(1) "!" }
Задача. Ассоциативные массивы
Создайте массив заработных плат $arr. Выведите на экран зарплату Пети и Коли.
<?/*Дан массив:*/$a=['Коля'=>'1000$','Вася'=>'500$','Петя'=>'200$']?>
Решение: чтобы вывести зарплату Коли следует вывести значение элемента массива с ключом 'Коля'. Сделаем это:
<?$a=['Коля'=>'1000$','Вася'=>'500$','Петя'=>'200$'];echo$a['Коля']/*Выведет 1000$*/?>
1000$
Задача. Способы создания массива
Создать массив $a с элементами 1,2,3,4,5 2-мя различными способами.
Решение:
1-й способ создать массив - объявить его через []:
<?$a=[1,2,3,4,5];var_dump($a)?>
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }
2-й способ создания массива - это поступить таким образом:
<?$b[]=1;$b[]=2;$b[]=3;$b[]=4;$b[]=5;var_dump($b)?>
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }
Задача. Многомерный массив
Дан многомерный массив $a:
<?$a=['ru'=>['голубой','красный','зеленый'],'en'=>['blue','red','green']];var_dump($a)?>
array(2) { ["ru"]=> array(3) { [0]=> string(14) "голубой" [1]=> string(14) "красный" [2]=> string(14) "зеленый" } ["en"]=> array(3) { [0]=> string(4) "blue" [1]=> string(3) "red" [2]=> string(5) "green" } }
Выведите с его помощью слово 'голубой'.
Решение: так как массив многомерный (в нашем случае 2-мерный), то нам придется написать несколько квадратных скобок подряд. Поясню это по шагам. Давайте сделаем так:
<?var_dump($a['ru'])?>
array(3) { [0]=> string(14) "голубой" [1]=> string(14) "красный" [2]=> string(14) "зеленый" }
В этом случае результатом будет массив ['голубой','красный','зеленый'], который является частью нашего многомерного массива. Чтобы вывести слово 'голубой', на необходимо дописать еще 1 квадратную скобку с ключом, соответствующим этому элементу (у него нет явного ключа - значит его ключ 0):
<?echo$a['ru'][0]/*Выведет голубой*/?>
голубой
Выведем теперь слово красный:
<?echo$a['ru'][1]/*Выведет красный*/?>
красный
Выведем red:
<?echo$a['en'][1]/*Выведет red*/?>
red
Задачи для решения. Работа с массивами
Создайте массив $a=['a','b','c']. Выведите значение массива на экран с помощью функции var_dump().
<?$a=['a','b','c'];var_dump($a)?>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
С помощью массива $a из предыдущего номера выведите на экран содержимое 1-го, 2-го и 3-го элементов.
<?$a=['a','b','c'];echo$a[0].$a[1].$a[2]?>
abc
Создайте массив $a=['a','b','c','d'] и с его помощью выведите на экран строку 'a+b, c+d'.
<?$a=['a','b','c','d'];echo$a[0].'+'.$a[1].', '.$a[2].'+'.$a[3]?>
a+b, c+d
Создайте массив $a с элементами 2,5,3,9. Умножьте 1-й элемент массива на 2-й, а 3-й элемент на 4-й. Результаты сложите, присвойте переменной $r. Выведите на экран значение этой переменной.
<?$a=[2,5,3,9];echo$a[0]*$a[1].', '.$a[2]*$a[3];$r=$a[0]*$a[1]+$a[2]*$a[3];echo'<p>'.$r?>
10, 27
37
Заполните массив $arr числами от 1 до 5. не объявляйте массив, а просто заполните его присваиванием $a[]=новое значение.
<?$a[]=1;$a[]=2;$a[]=3;$a[]=4;$a[]=5;var_dump($a)?>
array(9) { [0]=> int(2) [1]=> int(5) [2]=> int(3) [3]=> int(9) [4]=> int(1) [5]=> int(2) [6]=> int(3) [7]=> int(4) [8]=> int(5) }
Ассоциативные массивы
Создайте массив $a. Выведите на экран элемент с ключом 'c'.
<?$a=['a'=>1,'b'=>2,'c'=>3];echo$a['c']?>
3
Создайте массив $a. Найдите сумму элементов этого массива.
<?$a=['a'=>1,'b'=>2,'c'=>3];echo($a['a']+$a['b']+$a['c'])?>
6
Создайте массив заработных плат $a. Выведите на экран зарплату Пети и Коли.
<?$a=['Коля'=>'1000$','Вася'=>'500$','Петя'=>'200$'];echo'<p>'.$a['Петя'].'<p>'.$a['Коля']?>
200$
1000$
Создайте ассоциативный массив дней недели. Ключами в нем должны служить номера дней от начала недели (понедельник - должен иметь ключ 1, вторник - 2 и т.д.). Выведите на экран текущий день недели.
<?$a=[1=>'пн','вт','ср','чт','пт','сб','вс'];echo$a[3]?>
ср
Пусть теперь номер дня недели хранится в переменной $d, например там лежит число 3. Выведите день недели, соответствующий значению переменной $d.
<?$a=[1=>'пн','вт','ср','чт','пт','сб','вс'];$d=3;echo$a[$d]?>
ср
Многомерные массивы
Создайте многомерный массив $a. С его помощью выведите на экран слова 'joomla', 'drupal', 'зеленый', 'красный'.
$a=['x'=>['joomla','wordpress','drupal'],'y'=>['blue'=>'голубой','red'=>'красный','green'=>'зеленый']]
joomla
drupal
зеленый
красный
Создайте 2-мерный массив. 1-е 2 ключа - это 'ru' и 'en'. Пусть 1-й ключ содержит элемент, являющийся массивом названий дней недели по-русски, а 2-й - по-английски. Выведите с помощью этого массива понедельник по-русски и среду по английски (пусть понедельник - это 1-й день).
понедельник
sreda
Пусть теперь в переменной $l хранится язык (она принимает 1 из значений или 'ru', или 'en' - либо то, либо то), а в переменной $d - номер дня. Выведите словом день недели, соответствующий переменным $l и $d. Т.е.: если, к примеру, $l='ru' и $d=3 - то выведем 'среда', а если $l='en' и $d=6 - то выведем 'subbota'.
среда
subbota