Массивы PHP
Wab IT
Массивы в PHP это набор упорядоченных данных.
Создадим ассоциацию для массива, массив — масса — количество.
Массив создается как и переменная, только вместо кавычек после знака ровно ставим скобки и в них элементы через запятую.
Запись массива в ранних версиях php, которую вы можете встретить в коде, с функцией для создания массива array, элементы в круглых скобками и записываются они как и в переменной, строковые в кавычках, а численные без.
Представим шкаф в котором лежит масса вещей, на каждой полке своя группа одежды, верхняя, нижняя, летняя и зимняя и т.д. Вот вы решили записать что и где лежит, а запишем как раз при помощи массива
Создадим массив, как в ранних версиях php, для примера.
$shkaf = array( 'veshi', 1);
Вывод массива, название $массив[индекс] или $массив['ключ'][индекс]
echo $shkaf[0];
Создадим в шкафу полки.
$shkaf = array('polka ', 1, 'polka', 2, 'polka', 3, );
Так как мы размещаем вещи по полкам в шкафу и записываем, то создадим полки в массиве шкаф, под каждый вид одежды. Перепишем массив в короткую запись.
$shkaf = ['майки', 'свитера', 'джинсы', ];
В конце запятую можно не указывать, однако принято ставить для возможно последующего добавления данных в массив.
В программировании счет начинается с цифры, а первая цифра 0. Поэтому индекс у полки с майками будет 0, свитера 1, джинсы 2. Понятно что для трех полок нам не зачем создавать записи, пример для визуальной ассоциации. Выведем массив через
var_dump($shkaf);
array(3) { [0]=> string(10) «майки» [1]=> string(12) «свитер» [2]=> string(12) «джинсы»}
Видим в массиве (3) элемента, в первом ключе [0] тип строка и (10) знаков «майки» и т.д
Почему у нас в ключе [0] 5 букв, а вывело стринг 10? Потому что мы ввели название кириллицей. На сегодняшний день создавать ключевые записи данных и такие как название переменных, функций, массивов, и т.д. лучше латиницей, во избежание таких вот и других недоразумений.
Если шкаф не встроенный на всю стену до потолка, то пространство над шкафом можно использовать для сезонной обуви в коробках. Если мы просто добавим название полки в массив то она добавится следующим числом за максимальным значением индекса. Добавим в массив obuv.
$shkaf[ ] = 'obuv';
Отобразить элементы в массиве можно различными способами. К примеру можно записать их в переменную, указав имя массива и индекс элемента.
$vesh1 = $shkaf[0]; // создали переменную и записали в нее первый элемент
echo $vesh1; // отобрали первый элемент из массива записанный в переменную
Можно сразу прописать имена всем элементам функцией list(). В таком случае в название переменных записываются индексы из массива.
list($vesh1, $vesh2, $vesh3) = $shkaf; // создали переменные и записали в них элементы из массива шкаф при помощи функции лист
echo "<p> $vesh1, $vesh2, $vesh3 "; // отобразили элементы через переменные
В уроках работы с циклами, так же будем использовать функцию list.
И обувь добавилась индексом 3, так как в шкафу максимальное число индекса 2, а на самом деле это ведь над шкафом, то есть как раз таки нулевая полка, а если мы при добавлении обуви в массив, добавим ее под индексом [0],
$shkaf[0] = 'obuv';
то просто перезапишем полку майки, на обувь, так как указали уже занятый индекс. Поэтому давайте укажем каждой полке свою очередность, то есть зададим ключи и запишем название полок. К примеру мы предположили что под каждый вид одежды нам потребуется не одна полка. Майки они тонкие и понадобится 2 полки, свитера объемные под них 3 полки, под джинсы остальные. Зарезервируем под каждый элемент одежды еще полки.
Нумерованные массивы
Добавим нумерованный ключ элементам в нашем массиве шкаф.
Добавляется ключи элементам в массиве, знаками ровно и больше =>
$shkaf = [ 1 => 'майки', 3 => 'свитера', 6 => 'джинсы', ];
Так как мы переписали массив добавив ключ, добавленный элемент обувь удалился.
Переместим элементы обувь под отредактированный массив и выведем.
Так как у нас одноуровневый массив c нумерованным ключем, мы можем его вывести как переменные, в двойных кавычках, через запятые.
echo "<p> $shkaf[0] , $shkaf[1] , $shkaf[2]";
Теперь при вызове ключа 0, у нас будет обувь, при вызове 1 майки, а при вызове 2 будет ошибка, так как такого элемента в массиве у нас нет.
Warning: Undefined array key 2 in // 2 у нас в резерве поэтому при вызове ошибка, неопределенный ключ массива.
Выведем массив через функцию print_r c 'лементом <pre>, который определяет блок предварительно форматированного текста.
echo '<pre>';
print_r($shkaf);
echo '</pre>';
Видим
array(5) { // в массиве у нас 5 элементов
[1]=> string(10) «майки» // под ключ 1 майки и 2 мы зарезервировали
[3]=> string(14) «свитера» // ключ 3 свитера и еще 3 в резерве.
[6]=> string(12) «джинсы» // ключ 6 джинсы
[7]=> string(4) «obuv» // дальше мы добавили обувь и элемент занял следующий индекс 7
[0]=> string(4) «obuv» } // и под нулевым ключем мы дописали обувь.
Так у нас два элемента обувь. Полку ниже джинс, под обувь мы использовать не будем, поэтому удалим обувь с индексом 7.
Удаление элементов в массиве, используем конструкция unset. Удалим лишний элемент с индексом. Пишем, сброс ($массив[индекс]). или ключ
unset($shkaf[7]);
Ассоциативные массивы
Мы разложили вещи на полки по номерам. Но ведь в шкафу и так видно где майки, а где свитера. Давайте создадим ассоциативные массивы, то есть дадим название полкам.
Ассоциативный массив создается как и нумерованный, только так, как это строковый ключ, то записываем его в кавычках. Перепишем наш номерованный массив в ассоциативный.
$shkaf = ['mayka' => 'майки ', 'sviter' => 'свитера ', 'jensi' => 'джинсы ',];
И опять мы потеряли полку с обувью.
Имейте в виду, при изменении массива на нумерованный или ассоциативный, вы теряете добавленные в него данные.
Добавим в низ шкафа ассоциативный массив, полку с носками.
$shkaf['noski'] ='носки';
Перезапишем вывод массива чтобы не было ошибки, незабываем что строковые ключи записываем в кавычках. Так как у нас строковые ключи, то вариант записи вывода в двойных кавычках не подходит. Убираем кавычки, а перенос тега '<p>', записываем с конкатенацией или в фигурных кавычках, как переменную со множеством html тегами.
echo "<p> {$shkaf['mayka']}, <br>полка 2 {$shkaf['sviter']} <br> {$shkaf['jensi']} ";
Можно записать и без фигурных скобок и без конкатенации, если внутри квадратных скобок не прописывать кавычки на ключе.
echo "<p> $shkaf[mayka],<br>полка 2 $shkaf[sviter] <br> $shkaf[jensi] ";
Так как мы раннее резервировали дополнительные полки для, еще маек, свитеров и джинс. Теперь у нас нет нумерации, а мы хотим разделить вещи по стилю или сезону. Для этого можем использовать многомерные массивы.
Многомерные массивы
Добавим на полки одежду и запишем в наш массив шкаф.
Давайте на первую сложим майки, а на вторую футболки и добавим многомерный массив mayka. Создается многомерный масив как и обычный массив в квадратных скобках [ ], только внутри массива и отделяется запятой. Находим наш ключ mayka и дописываем после => .
Пример.
Создали двумерный массив
'mayka' => [ // создали двумерный массив
'1 с рисунком', // добавили на полку 1, индекс 0
' 2 однотонная', // добавили на полку 2, индекс 1
], // закрывающая скобка и запятая.
Создадим трехмерный массив
Перепишем так же свитер создав трехмерный массив. На подобии верхнего примера.
'sviter' => [ // создали двумерный массив для полок свитеров.
1 => ' 1 полувер', // первая полка с ключом 1
2 => ['kofta' => [' 2 на пуговицах', 'на молнии',] // на полке 2 создали трехмерный ассоциативный массив с ключем кофта, с двумя индексами.
], // закрыли трехмерный массив кофта.
3 => ['bayka' => ' 3 толстовка с капюшоном',] // полка 3 запись с ключем и индексом для примера
], // закрыли двумерный массив и разделили запятой
Выведем массив шкаф через функцию print_r и для удобного отображения сделаем списком.
echo '<pre>';
print_r($shkaf);
echo '</pre>';
Теперь отобразим наш шкаф на странице в виде полок то есть списка. Заметьте чтобы отобразить данные каждого индекса таким способом, требуется указывать полный путь.
$ массив [ключ][индекс].
Добавляем к тексту массив или тег к массиву, при помощи знака конкатенации, точки . или , запятой. Тегом переноса строки, на полку ниже складываем футболки.
echo '<p> Шкаф в гостинной</p>' // Выводим отдельно с тегом параграф
. 'Майки: ' . $shkaf['mayka'][0] .'<br>' // массив ключ майка и индекс 0
. $shkaf['mayka'][1] . '<p>' // вывели со второй полки ключ майки индекс 1 и параграфом отделили свитера.
. $shkaf['sviter'][1] // первый ключ из индекса свитера
. '<br> Кофта: ' . $shkaf['sviter'][2]['kofta'][0] . ', ' . $shkaf['sviter'][2]['kofta'][1] // через запятые перечислили индекс по ключу кофта, который уже в трехмерном массиве.
. '<br>' . $shkaf['sviter'][3]['bayka'] // здесь у нас ключ для примера который разберем ниже. , ' <p> ' . $shkaf['noski'] ; // и носки одномерный массив.
Добавить индекс и ключ в многомерный массив
Мы с вами записали два многомерных массива, но если на полку к кофта мы можем добавить еще один индекс, после пустых скобок, к примеру допишем количество вещей в ключе кофта, 9.
$shkaf['sviter'][2]['kofta'][] = '9';
Если мы в скобках добавим ключ, то получим уже 9 к ключу, а не к кофте.
На полку с индексом байка мы сможем добавить индекс, который перезапишет существующий, а разница между ними, как вы видите только к скобках. При добавлении как, в примере с кофта, выдаст ошибку. Добавить, не ключ, не индекс количество, в байка мы не сможем, так как байка не является ассоциативным ключем массива,
$shkaf['sviter'][3]['bayka'] = ' 5 ';
но сомжем добавить в ключ 3, зададим ключ и в него уже запишем элемент.
$shkaf['sviter'][3]['полка'] = ', без капюшона'; // добавили ключ и индекс
Отобразим на третьей полке, за байка.
, $shkaf['sviter'][3]['полка']
Так же и в джинсы мы не сможем дописать количество. Будьте внимательны при создании многомерных массивов.
Скорее всего вы задумались, мы создали какой то не массив, а бардак в шкафу и вы будете правы. Если вы не торопясь все писали ручками и проверяли, то должны были понять как записывать и как выводить массив, индексы и ключи. Теперь когда все стало предельно ясно, давайте упорядочим набор наших данных в массиве. Переберем шкаф. Я запишу так, а вы в удобном для вас порядке.
$shkaf = [
'mayka' => [
1 => [' майка с рисунком ', 7,],
2 => [' футболки однотонные ', 5],
],
'sviter' => [
3 => [' полувер ', 3,],
4 => [' на пуговицах ', 3, ' на молнии ', 4,],
5 => [' толстовка с капюшоном ', 5,],
],
'jensi' => [' джинсы ', 6,],
];
Выведем сколько у нас всего маек, свитеров. Для этого мы выбираем в массиве индексы с количеством, плюсуем и записываем в переменную.
$sumMayka = $shkaf['mayka'][1][1] + $shkaf['mayka'][2][1];
$sumSviter = $shkaf['sviter'][1][1] + $shkaf['sviter'][2][1] + $shkaf['sviter'][2][3] + $shkaf['sviter'][3][1];
Отобразим результат.
echo 'В шкафу <p>' . 'Маек ' . $sumMayka . '<p>' . 'Свитер ' . $sumSviter . '<p>' . ' Джинсы ' . $shkaf['jensi'][1];
Функции в массиве
Для работы с массивами так же можно использовать функции.
Пару простых примеров, а посложнее в следующих уроках.
К примеру у нас есть переменная с ремнями.
Пример 1
$remni = 'белый, черный, красный ';
и мы хотим добавить их в массив шкаф. Сделаем из переменной массив, чтобы не повторять имя переменной добавим Маs, для понимания что это массив.
Для того чтобы из переменной сделать массив, пишем имя массива, равно (в круглых скобках array и) $переменную
$remniMas = (array) $remni; // создали массив из переменной ремни.
print_r($remniMas); // проверяем массив с индексом 0.
переменная записалась под одним индексом 0. Записать такую переменную задав каждому элементу индекс, можно функцией explode, которая из строки создает массив используя разделитель, в данном примере запятая. Создадим переменную рубашки с функцией explode.
$rubashka = explode(',', ' белая, черная, красная' );
print_r($rubashka); // теперь у нас индексы. 0, 1 ,2.
Вывести массив можно функцией implode, но только одномерный.
echo implode( '<br>', $rubashka ); // вывели с переносом строки
Так же мы можем работать с массивом по индексам. Пример
echo " Рубашка - $rubashka[1]"; // Рубашка черная
Самостоятельно перепишите переменную ремни, с функцией explode, чтобы получить массив с индексами как в примере с рубашкой.
Слияние, объединение массивов.
К примеру у нас ремни и рубашки и мы хотим добавить в одно отделение шкафа, назовем его пинал1.
Если мы добавим массивы без ключей в одну переменную оператором плюс, то произойдет конфликт индексов и мы сможем отобразить лишь один из массивов. Если будет двумерный массив с разными ключами.
Пример 2
$rubashka = [ 1 => [' белая', ' черная', 'красная' ]];
$remni = [ 2 => [' белый',' черный',' красный' ]];
в таком случае оператор плюс сработает корректно.
$pinal1 = $remni + $rubashka ;
Отобразить двумерный массив мы можем как как в прошлых примерах, а сможем вывести циклом, который изучим в следующем уроке Цикл foreach PHP.
Для примера, чтобы вы увидели как в переменной мы соединили два массива, выведем массив в цикле.
foreach($pinal1 as $lo => $lol){
echo '<br>'. $lo ;
foreach($lol as $key2) {
echo $key2;
}
А для слияния массивов с одинаковыми индексами из Пример 1, используется функция array_merge
$pinal1 = array_merge($remni, $rubashka); // записали в пинал две функции.
Так как это одномерный массив, вывели их при помощи функции implode
echo implode( '<br>' , $pinal1); // массив из Пример 1
Оператор многоточие или spread слияние массива
И еще один оператор для объединения массива появился в новых версиях php. Мы его использовали в прошлом уроке в функциях. Теперь просто добавляем массив в массив и выводим его. Пример
$rubashka = [' белая', ' черная', 'красная' ] ; // массив
$remni = [' белый',' черный',' красный', ...$rubashka ] ; // добавили массив в массив
echo implode( '<br>' , $remni); // вывели один массив, а получили данные с двух.
В ранних версиях php, вы могли встретить такую запись. Пример с массивом по середине.
$remni = arra_merge( [' белый' , ' черный '] , $rubashka , [ ' красный'] );
Кстати добавлять массив в массив, можно хоть в переди, хоть в середине массива и никаких конфликтов индексов не будет.Создадим функцию с цветом.
function cvet (){ // написали функцию
return [' синее ' , ' зеленное ']; // записали в результат цвет в виде массива
}
$sliv = [ ' Платья', ...cvet() , ...$remni ]; // в масив слив поместили элемент Платья и функцию, и массив ремни в котором рубашки.
И циклом вывели из всех массивов, индексы и элементы.
foreach($sliv as $lo => $lol){
echo '<br>'. $lo , $lol; // через перенос строки.
}
Но если мы передаем в функцию смешанный массив с ассоциативными ключами, то элементы с ассоциативными ключами записываем в конце массива. Еще пара примеров для закрепления.
$fruct = [11, 22, 33, 'gr' => 5, 'ap' => 7, 'lim' => 11, 'man' => 15, 'vin' => 18]; // Переписали переменные фруктами в массив.
function fruct( ...$fruct){ // в функции в параметр с многоточием передали все аргументы
return array_sum($fruct); // функцией посчитали.
}
$sliv = 21;// переменная слива для примера
echo fruct( $sliv, 33 ,' 11', ...$fruct ); // передаем массив $fruct и даже если число 11 записанное строкой, так же посчитает.
Есть один ньюанс.
Для сохранения поддержки распаковки аргументов функции, оператором многоточие строковые ключи не поддерживаются. При обнаружении строкового ключа в массиве данных, будет показана ошибка.
Встроенные ФУНКЦИИ позволяют решать множество задач, уметь работать с ними не менее важно, чем написание их.
Функция count подсчитывает количество элементов массива
Пример
echo count($remni); // посчитает и ремни и вложенный массив рубашки
Но в многомерном массиве шкаф, посчитает только ассоциативные ключи.
Чтобы посчитать все элементы в шкафу используем константу COUNT_RECURSIVE, для рекурсивного подсчета.
echo count($shkaf, COUNT_RECURSIVE); // посчитали многомерный массив.
Записали функция count(посчитали ассоциативные ключи в шкафу и, константой прошлись по внутренностям ) В итоге посчитали весь массив, все ключи и индексы.
Достать первый элемент массива из шкафа, функцией current.
print_r (current($shkaf));
И последний, функцией end .
print_r (end($shkaf));
Одномерные массив можно выводить сразу. Если вы переписали массив шкаф, то там остались носки, именно их и получим в конце массива
echo " нижняя полка " . end($shkaf);
Для вывода данных из многомерного массива используется цикл. Циклы будем писать в следующих уроках.
Получить часть массива функцией
Указав индекс и длину (шаг), функцией array_slice. Ниже в примере мы указали индекс 1 и длину 1. Что выведет нам все из многомерного массива sviter. Индексом свитер идет 1 и длина 1, то есть весь многомерный массив свитер. Поэкспериментируйте меняя индекс и длину.
print_r (array_slice($shkaf, 1, 1));
Извлечь элемент массива функцией.
array_shift первый элемент в массиве
array_pop последний элемент в массиве
Извлечем в переменную первый элемент.
$element1 = array_shift($shkaf);
и последний
$element2 = array_pop($shkaf);
выведем первый
print_r($element1);
И последний одномерный массив можно сразу вывести в виде переменной, в которую при помощи функции извлекли и записали нижнюю полку.
echo "последний элемент в массиве $element2 ";
Теперь при вызове массива он будет без первого и последнего элементов.
Домашнее задание
Создайте трехмерный массив правого блока шкафа, только с индексом без ключей. В который сможем добавлять индекс и ключи на на любой из уровней массива.
Трусы, // трехмерный массив 0,0,0.
Шорты, // трехмерный 1,0,0
футболка: адидас, найк, // трехмерный 1,1 / 0,1,2
Носки спортивные. // трехмерный 2,0,0
и вывести с каждой полки, чтобы получилось.
трусы,
футболка: найк,
Носки спортивные,
После чего добавьте на полку футболка, пума.
Проверить домашнее задание.