Как создать многомерный массив php. Использование многомерных массивов в PHP. Что такое массив PHP
Часто нужно пройти по всем элементам массива PHP и провести какую-нибудь операцию над каждым элементом. Например, вы можете вывести каждое значение в таблицу HTML или задать каждому элементу новое значение.
В данном уроке мы рассмотрим конструкцию foreach при организации цикла по индексированным и ассоциированным массивам.
Цикл по значениям элементов
Самый простой случай использования foreach - это организация цикла по значениям в индексированном массиве. Основной синтаксис:
Foreach ($array as $value) { // Делаем что-нибудь с $value } // Здесь код выполняется после завершения цикла
Например, следующий скрипт проходит по списку режисеров в индексированном массиве и выводит имя каждого:
$directors = array("Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang");
foreach ($directors as $director) {
echo $director . "
";
}
Выше приведенный код выведет:
Alfred Hitchcock Stanley Kubrick Martin Scorsese Fritz Lang
Цикл по ключам и значениям
А что насчет ассоциированных массивов? При использовании такого типа массивов часто нужно иметь доступ к ключу каждого элемента, так же как и к его значению. Конструкция foreach имеет способ решить поставленную задачу:
Foreach ($array as $key => $value) { // Делаем что-нибудь с $key и/или с $value } // Здесь код выполняется после завершения цикла
Пример организации цикла по ассоциированному массиву с информацией о кинофильмах, выводит ключ каждого элемента и его значение в HTML списке определений:
$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); echo "
- ";
foreach ($movie as $key => $value) {
echo "
- $key: "; echo "
- $value "; } echo "
Данный скрипт при выполнении выведет:
Title: Rear Window director: Alfred Hitchcock year: 1954 minutes: 112
Изменение значения элемента
А как обстоит дело с изменением значения элемента при проходе цикла? Вы можете попробовать такой код:
Foreach ($myArray as $value) { $value = 123; }
Однако, если запустить его на выполнение, то вы обнаружите, что значения в массиве не изменяются . Причина заключается в том, что foreach работает с копией значений массива, а не с оригиналом. Таким образом оригинальный массив остается нетронутым.
Для изменения значений массива вам нужна ссылка на значение. Для этого нужно поставить знак & перед переменной значения в конструкции foreach:
Foreach ($myArray as &$value) { $value = 123; }
Например, следующий скрипт проходит циклом каждый элемент (имя режиссера) в массиве $directors , и использует функцию PHP explode() и конструкцию list для перемены мест имени и фамилии:
$directors = array("Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang");
// Изменяем формат имени для каждого элемента
foreach ($directors as &$director) {
list($firstName, $lastName) = explode(" ", $director);
$director = "$lastName, $firstName";
}
unset($director);
// Выводим конечный результат
foreach ($directors as $director) {
echo $director . "
";
}
Скрипт выведет:
Hitchcock, Alfred Kubrick, Stanley Scorsese, Martin Lang, Fritz
Отметим, что скрипт вызывает функцию unset() для удаления переменной $director после завершения первого цикла. Это хорошая практика, если вы планируете использовать переменную позже в скрипте в другом контексте.
Если не удалять ссылку, то есть риск при дальнейшем выполнении кода случайной ссылки на последний элемент в массиве ("Lang, Fritz"), если далее использовать переменную $director , что приведет к непредвиденным последствиям!
Резюме
В данном уроке мы рассмотрели, как использовать конструкцию PHP foreach для организации цикла по элементам массива. Были рассмотрены вопросы:
- Как организовать цикл по элементам массива
- Как получить доступ к ключу и значению каждого элемента
- Как использовать ссылку для изменения значений при проходе цикла
$arr
[
1
] =
"PHP"
;
$arr
[
2
] =
"MySQL"
;
$arr
[
3
] =
"Apache"
;
?>
Элементы массива можно использовать в двойных кавычках как обычные переменные, так код
echo
"
$arr
[
1
]
$arr
[
2
]
$arr
[
3
]
"
;
?>
$arr
[
"first"
] =
"PHP"
;
$arr
[
"second"
] =
"MySQL"
;
$arr
[
"third"
] =
"Apache"
;
?>
В этом случае массив называется ассоциативным , а его индексы называются ключами . Для вывода элемента массива в строке кавычки (ни двойные, ни одинарные) указывать не следует:
echo
"
$arr
[
first
]
$arr
[
second
]
$arr
[
third
]
"
;
?>
Так как у ассоциативных массивов нет индексов, для обхода их введён специальный вид цикла - foreach :
foreach($arr
as
$key
=>
$value
)
{
echo
"
$key
=
$value
"
;
}
?>
В результате работы цикла будет выведено три строки
First = PHP
second = MySQL
third = Apache
Конструкция "$key =>", позволяющая получить доступ к ключу массива на каждом из циклов является не обязательно и может быть опущена:
foreach($arr
as
$value
)
{
echo
"
$value
"
;
}
?>
Ряд функций, также позволяют возвращать массивы, например, функция file() , которая читает файл и возвращает его содержимое в виде массива. Каждый элемент массива соответствует одной строке.
$arr
=
file
("text.txt"
);
for($i
=
0
;
$i
<
count
($arr
);
$i
++)
{
echo
$arr
[
$i
].
"
"
;
}
?>
Другой полезной функцией является функция explode() , которая позволяет разбить строку на несколько фрагментов, каждый из которых помещается в отдельный элемент массива:
$str
=
"345|[email protected]|http://www.сайт|login|password"
;
$arr
=
explode
("|"
,
$str
);
for($i
=
0
;
$i
<
count
($arr
);
$i
++)
{
echo
$arr
[
$i
].
"
"
;
}
?>
Результат работы скрипта может выглядеть следующим образом:
345
[email protected]
http://www.сайт
login
password
Существует и обратная функция - implode(), которая объединяет, элементы массива в строку, используя для этого заданный разделитель:
$arr
=
"345"
;
$arr
=
"[email protected]"
;
$arr
=
"http://www.сайт"
;
$arr
=
"login"
;
$arr
=
"password"
;
$str
=
implode
("##"
,
$arr
);
echo
$str
;
//345##[email protected]##http://www.
?>
Замечание
Вообще функций, которые потрошат строку превеликое множество, рассмотрение всех их выходят за рамки данной статьи.
Удалить отдельный элемент массива можно при помощи функции unset() , а проверить существование массива можно при помощи функции isset() . Определим массив из 10 элементов и уничтожим каждый чётный элемент.
unset($arr
[
0
],
$arr
[
2
],
$arr
[
4
],
$arr
[
6
],
$arr
[
8
]);
// Проверяем существуют ли элементы массива
for($i
=
0
;
$i
<
10
;
$i
++)
{
if(isset($arr
[
$i
])) echo
"Элемент
$arr
[
$i
]
определён
"
;
else echo
"Элемент
$arr
[
$i
]
не определён
"
;
}
?>
Результатом работы скрипта из будут следующие строки
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент $arr определён
При помощи функции unset() можно уничтожить весть массив сразу.
$arr
= array(9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
);
unset($arr
);
if(isset($arr
)) echo
"Массив определён"
;
else echo
"Массив не определён"
;
?>
До этого массивы выводились при помощи цикла, однако в PHP предусмотрена специальная функция для вывода дампа массива print_r() . Функция ориентирована на вывод в консольный поток, поэтому при выводе результатов в окно браузера лучше обрамить её тэгами
И:
$arr = "345";
$arr = "[email protected]";
$arr = "http://www.сайт";
$arr = "login";
$arr = "password";
echo "
print_r($arr);
echo " ";
?>
Результат работы скрипта выглядит следующим образом:
Array
=> 345
=> [email protected]
=> http://www.сайт
=> login
=> password
)
Многомерные массивы
В качестве элементов массива могут выступать не только скалярные величины, но и сами массивы. В этом случае получаются так называемые многомерные массивы.
Пусть необходимо получить такую таблицу:
Для этого создадим двумерный массив:
$arr
= array(array(‘Вася’
,
‘слесарь’
,
2500
),
array(‘Миша’
,
’строитель’
,
3000
),
array(‘Андрей’
,
‘шофер’
,
2700
));
?>
Теперь таблицу можно вывести при помощи следующего кода:
for ($i
=
0
;
$i
<
3
;
$i
++)
{
for ($j
=
0
;
$j
<
3
;
$j
++)
{
echo
" | "
.
$arr
[
$i
][
$j
];
}
echo
"
"
;
}
?>
Результат:
| Вася | слесарь | 2500
| Миша | строитель | 3000
| Андрей | шофер | 2700
Также можно использовать трехмерные, четырехмерные и т.п. массивы.
Операции над массивами (сборник рецептов)
1) Определения числа элементов в массиве count() :
Создадим массив $name:
?>
Чтобы определить число элементов в массиве можно поступить следующим образом:
echo
‘Число элементов в массиве
-
’
.
count
($name
);
?>
Результат:
Число элементов в массиве – 8
2) Объединение массивов
a) Создадим два ассоциативных массива $a и $b:
$a
= array(“a”
=>
”aa”
,
“b”
=>
“bb”
);
$b
= array(“c”
=>
”cc”
,
“d”
=>
“dd”
);
?>
Пусть необходимо создать массив $c, которые будет содержать как элементы массива $a так и массива $b:
$a
= array("a"
=>
"aa"
,
"x"
=>
"xx"
);
$b
= array("c"
=>
"cc"
,
"d"
=>
"dd"
);
$c
=
$a
+
$b
;
echo
"
" ;" ;
print_r ($c );
echo "
?>
Результат:
Array
[a] => aa
[x] => xx
[c] => cc
[d] => dd
)
b) Создадим два числовых массива $a и $b:
$a
= array(10
,
20
);
$b
= array(100
,
200
,
300
,
400
,
500
);
?>
Их уже не получится объединить при помощи конструкции $c = $a + $b;. Для их объединения потребуется воспользоваться функцией array_merge() :
$c
=
array_merge
($a
,
$b
);
?>
3) Сортировка массива
Воспользуемся массивом $name:
$name
= array("Boss"
,
"Lentin"
,
"NAV"
,
"Endless"
,
"Dragons"
,
"SiLeNT"
,
"Doctor"
,
"Lynx"
);
?>
Пусть требуется отсортировать массив в алфавитном порядке, для этого можно воспользоваться следующим кодом:
sort
($name
);
echo
"
" ;" ;
print_r ($name );
echo "
?>
Результат:
Array
=> Boss
=> Doctor
=> Dragons
=> Endless
=> Lentin
=> Lynx
=> NAV
=> SiLeNT
)
Пусть необходимо из массива $name выбрать самый короткий элемент(у которого наименьшее количество символов), в этом случае можно воспользоваться кодом:
$name
= array("Boss"
,
"Lentin"
,
"NAV"
,
"Endless"
,
"Dragons"
,
"SiLeNT"
,
"Doctor"
,
"Lynx"
);
$min
=
strlen
($name
[
0
]);
$nam
=
$name
[
0
];
for ($i
=
1
;
$i
<
count
($name
);
$i
++)
{
$len
=
strlen
($name
[
$i
]);
if ($len
<
$min
)
{
$nam
=
$name
[
$i
];
$min
=
strlen
($nam
);
}
}
echo
"Наименьшая длина - "
.
$nam
;
?>
4) Перемещение внутри массива
Создадим массив $num:
$num
= array(1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
);
?>
Пусть требуется отобразить элементы массива в обратном порядке, в этом случае можно воспользоваться кодом:
$end
=
end
($num
);
While ($end
)
{
echo
$end
.
" - "
;
$end
=
prev
($num
);
}
?>
Результат:
10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 – 1
Приведённый выше код можно модифицировать:
$num
=
range
(1
,
10
);
print_r
(array_reverse
($num
));
?>
Функция range(1,10) создает массив (1,2,3,4,5,6,7,8,9,10) со случайным расположением элементов. Функция array_reverse() принимает массив и располагает элементы в обратном порядке (10,9,8,7,6,5,4,3,2,1)
Функции next() , each() перемещают указатель на один элемент вперед. Функция reset() возвращает указатель на 1 элемент в массиве. Воспользуемся массивом $num.
В этой небольшой статье мы рассмотрим несколько способов работы с массивами. Стоит отметить, это один из самых важных типов данных и современные языки программирования даже сложно представить без них. Что же такое массив?
Массив представляет собой структурированный набор данных.
По их структуре можно определить это простой массив
или ассоциативный
. Нельзя сказать наверняка какой из них лучше, т.к. применять тот или иной тип нужно по ситуации.
Как создать простой массив в PHP
Вот как выглядит простой массив:
$my_array = array("Стул", "Облако", 29);?>
Сразу же хочу обратить ваше внимание на данные (да, я специально их так записал 🙂). Данные типа строка, или string
всегда записывайте в кавычках, не важно в каких, пойдут и одинарные и двойные (главное чтобы строка начиналась и закрывалась такой же кавычкой). У числа 29 тип integer
, или число — для таких типов данных кавычки не нужны.
Проверим как выглядит массив $my_array:
echo "
"; print_r($my_array); echo ""; /* получим Array ( => Стул => Облако => 29) */ ?>
так выглядит простой массив.
0,1,2
— индексы нашего массива. С помощью индексов мы можем вывести что-то конкретное из массива.
Также, мы можем создать такой же массив если напишем:
$my_array = "Стул"; $my_array = "Облако"; $my_array = 29; ?>
И, есть еще третий способ:
$my_array = array (0 =>"Стул", 1 => "Облако", 2 => 29);?>
И четвертый 🙂
$my_array = "Стул"; $my_array = "Облако"; $my_array = 29; ?>
индексы будут заполнены от 0.
PHP что такое ассоциативный массив
Что такое простой массив мы уже разобрались. Ассоциативный массив отличается тем, что вместо индексов используют ключи . То есть, для доступа к значениям мы уже не будем использовать 0,1 или 2. Запишем наш простой массив как ассоциативный:
$my_array["item"] = "Стул"; $my_array["sky"] = "Облако"; $my_array["number"] = 29; /* получим если вызовем print_r($my_array); Array ( => Стул => Облако => 29) */ ?>
И для вызова мы будем использовать
Вместо цифры (индекса ) мы задаем осмысленное название (ассоциацию) и наш индекс теперь можно назвать ключем массива (item, sky, number). Наиболее популярная и, пожалуй, самая удобная запись ассоциативного массива:
$my_array = Array("item" => "Стул", "sky" => "Облако", "number" => 29); ?>
Многомерный массив
Буквально пару слов про этого гиганта 🙂
$auto = array ("bmw" => array ("color" => "red", "year" => "2010", "mark" => "M5"), "audi" => array ("color" => "black", "year" => "2011", "mark" => "TT")); print_r ($auto); // вывод массива echo $auto["bmw"]["mark"]; // M5 ?>
Как вы поняли, вместо значения, которым раньше была строка или число, теперь выступает такой тип данных как массив (сделаю тебе массив в массиве, чтобы когда ты вызывал массив там был еще один массив :)).
ЗадачаНеобходимо перебрать по очереди и обработать все или некоторые эле-
менты массива.
Решение
Используйте оператор foreach:
Foreach ($array as $value) {
// Действие с $value
}
Или для получения ключей и значений массива:
Foreach ($array as $key => $value) {
// Действие II
}
Другим способом является применение оператора for:
for ($key = 0, $size = count($array); $key
// Действие III
}
И наконец, можно использовать функцию each() в комбинации с функцией list() и оператором while:
Reset($array) // сброс внутреннего указателя в начало массива
while (list($key, $value) = each ($array)) {
// Окончательное действие
}
Обсуждение
Цикл foreach – это наипростейший способ выполнения итераций с массивом:
// оператор foreach со значениями
foreach ($items as $cost) {
...
}
// оператор foreach с ключами и значениями
foreach($items as $item => $cost) {
...
}
В операторе foreach PHP перебирает не исходный массив, а его копию.
Напротив, при использовании функции each() и оператора for, PHP перебирает оригинальный массив. Поэтому, если внутри цикла происходит модификация массива, то можно получить (а можно и не получить) ожидаемое поведение.
Если необходимо изменить массив, то используйте прямую ссылку на него:
Reset($items);
while (list($item, $cost) = each($items)) {
if (! in_stock($item)) {
unset($items[$item]); // непосредственная адресация массива
}
}
Переменные, возвращаемые функцией each(), не ссылаются на исходные значения массива
– это их копии, поэтому их изменение не отражается на массиве. Вот почему нужно модифицировать переменную $items[$item] вместо переменной $item.
При использовании функции each() PHP отслеживает и запоминает положение внутри цикла. Чтобы начать цикл сначала после выполнения первого прохода, нужно вызвать функцию reset() для того, чтобы вернуть указатель обратно в положение перед циклом. В противном
случае функция each() вернет значение false.
Цикл for работает только в случае массивов с последовательными целыми ключами. Если длина массива не изменяется, то неэффективнопри каждом прохождении цикла снова вызывать функцию count() для вычисления переменной $items.
Поэтому для хранения длины массива всегда используйте переменную $size:
For ($item = 0, $size = count($items); $item
...
}
Если вы предпочитаете в целях разумной экономии использовать одну
переменную, то считайте в обратном направлении:
for ($item = count($items) - 1; $item >= 0; $item--) {
...
}
Ассоциативная версия цикла for:
For (reset($array); $key = key($array); next($array)) {
...
}
Это приведет к ошибке, если какой-нибудь элемент содержит строку со значением, приравненным к false, поэтому вроде бы нормальное значение, такое как 0, может привести к досрочному завершению цикла.
Наконец, используйте функцию array_map() для передачи каждого элемента обрабатывающей функции:
// переводим все слова в нижний регистр
$lc = array_map("strtolower", $words);
Первым аргументом функции array_map() является имя функции, которая модифицирует отдельный элемент, а второй аргумент – это массив, обрабатываемый в цикле.
Как правило, эти функции считаются менее гибкими, по сравнению с ранее рассмотренными методами, но они хорошо подходят для обработки и объединения множества массивов.
Если не известно, должны ли обрабатываться данные как скалярные величины или как массив, то необходимо предотвратить использование оператора foreach с не массивом. Один из способов – это применение функции is_array():
If (is_array($items)) {
// код с циклом foreach для массива
} else {
// код для скалярной величины
}
Другим способом является принудительное преобразование всех переменных в массив с помощью функции settype():
Settype($items, "array");
// код цикла для массивов
Это превращает скалярное значение в одноэлементный массив и делает код более привлекательным за счет небольших дополнительных накладных расходов.
Массив не обязательно должен представлять из себя простой список ключей и простых значений. Каждый элемент массива может содержать в качестве значения другой массив, который в свою очередь может тоже содержать массив и так далее. Таким образом можно создавать двумерные и трехмерные массивы.
Двумерные массивы
Двумерный массив - массив, который в качестве значений хранит в себе другие массивы. Рассмотрим создание двумерного массива с помощью конструктора array() :
$flowers = array(array("розы", 100 , 15), array("тюльпаны", 60 , 25), array("орхидеи", 180 , 7));
Массив $flowers содержит три массива. Как вы помните, для доступа к элементам одномерного массива надо указывать имя массива и ключ. То же самое верно и в отношении двумерных массивов, с одним исключением: каждый элемент имеет два ключа: первый для выбора строки, второй для выбора столбца.
Чтобы вывести элементы этого массива можно вручную прописать доступ к каждому из них, но лучше воспользоваться вложенными циклами:
Ручной доступ к элементам
";
echo $flowers." цена ".$flowers." количество ".$flowers."
";
echo $flowers." цена ".$flowers." количество ".$flowers."
";
echo "
Использование циклов для вывода элементов
"; echo "- ";
for ($row = 0; $row < 3; $row++) {
echo "
- Номер строки $row";
echo "
- ";
for ($col = 0; $col < 3; $col++) {
echo "
- ".$flowers[$row][$col]." "; } echo "
";
}
echo "
Вместо номеров столбцов (индексы, присвоенные им по умолчанию) можно задавать им нужные ключи. Для этой цели используются ассоциативные массивы. Следующий массив будет хранить те же данные, но уже с использованием ключей для именования столбцов с информацией:
$flowers = array(array("Название" => "розы", "Цена" => 100, "Количество" => 15), array("Название" => "тюльпаны", "Цена" => 60, "Количество" => 25,), array("Название" => "орхидеи", "Цена" => 180, "Количество" => 7));
Ключи создают дополнительное удобство для работы с массивом в тех случаях, когда нужно получить одно из значений. Необходимые данные можно легко найти, если обратиться к правильной ячейке, используя значимые имена строки и столбца. Однако при этом мы теряем возможность последовательно обхода массива с помощью цикла for .
Мы можем перебрать с помощью цикла for только дочерние массивы. Так как они, в свою очередь, являются ассоциативными, то для перебора их элементов нужно воспользоваться циклом foreach , или перебрать элементы вручную:
"розы", "Цена" => 100, "Количество" => 15), array("Название" => "тюльпаны", "Цена" => 60, "Количество" => 25,), array("Название" => "орхидеи", "Цена" => 180, "Количество" => 7)); echo "
Ручной доступ к элементам ассоциативного массива
"; for ($row = 0; $row < 3; $row++) { echo $flowers[$row]["Название"]." цена ".$flowers[$row]["Цена"] ." количество ".$flowers[$row]["Количество"]; echo ""; } echo "
Использование цикла foreach для доступа к элементам
"; echo "- ";
for ($row = 0; $row < 3; $row++) {
echo "
- Номер строки $row";
echo "
- ";
foreach($flowers[$row] as $key => $value) {
echo "
- ".$value." "; } echo "
";
}
echo "
Необязательно использовать для создания двумерного массива конструктор array() , можно воспользоваться и коротким синтаксисом - квадратными скобками:
$flowers = [ [ "Название" => "розы", "Цена" => 100, "Количество" => 15 ], [ "Название" => "тюльпаны", "Цена" => 60, "Количество" => 25, ], [ "Название" => "орхидеи", "Цена" => 180, "Количество" => 7 ] ];
Трёхмерные массивы
Не обязательно ограничиваться только двумя измерениями: так же, как элементы массива могут содержать массивы, эти массивы, в свою очередь, могут содержать новые массивы.
Трёхмерный массив характеризует ширину, высоту и глубину. Если представлять двумерный массив в виде таблицы, то трёхмерный добавляет к этой таблице слои. Каждый элемент такого массива будет ссылаться на слой, строку и столбец.
Если немного модифицировать наш массив с цветами, то можно переделать его в трёхмерный. В коде, представленном ниже видно, что трёхмерный массив - массив, содержащий массив массивов:
$flowers = [ [ ["розы", 100 , 15], ["тюльпаны", 60 , 25], ["орхидеи", 180 , 7] ], [ ["розы", 100 , 15], ["тюльпаны", 60 , 25], ["орхидеи", 180 , 7], ], [ ["розы", 100 , 15], ["тюльпаны", 60 , 25], ["орхидеи", 180 , 7] ] ];
Поскольку этот массив содержит только числовые индексы, мы можем использовать для его отображения вложенные циклы:
"; for ($layer = 0; $layer < 3; $layer++) { echo "
- ";
for ($row = 0; $row < 3; $row++)
{
echo "
- Номер строки $row";
echo "
- ";
for ($col = 0; $col < 3; $col++)
{
echo "
- ".$flowers[$layer][$row][$col]." "; } echo "
";
}
echo "