Как создать многомерный массив 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

Вот как выглядит простой массив:

Сразу же хочу обратить ваше внимание на данные (да, я специально их так записал 🙂). Данные типа строка, или string всегда записывайте в кавычках, не важно в каких, пойдут и одинарные и двойные (главное чтобы строка начиналась и закрывалась такой же кавычкой). У числа 29 тип integer , или число — для таких типов данных кавычки не нужны.
Проверим как выглядит массив $my_array:

"; print_r($my_array); echo ""; /* получим Array ( => Стул => Облако => 29) */ ?>

так выглядит простой массив.
0,1,2 — индексы нашего массива. С помощью индексов мы можем вывести что-то конкретное из массива.

Также, мы можем создать такой же массив если напишем:

И, есть еще третий способ:

"Стул", 1 => "Облако", 2 => 29);?>

И четвертый 🙂

индексы будут заполнены от 0.

PHP что такое ассоциативный массив

Что такое простой массив мы уже разобрались. Ассоциативный массив отличается тем, что вместо индексов используют ключи . То есть, для доступа к значениям мы уже не будем использовать 0,1 или 2. Запишем наш простой массив как ассоциативный:

Стул => Облако => 29) */ ?>

И для вызова мы будем использовать

Вместо цифры (индекса ) мы задаем осмысленное название (ассоциацию) и наш индекс теперь можно назвать ключем массива (item, sky, number). Наиболее популярная и, пожалуй, самая удобная запись ассоциативного массива:

"Стул", "sky" => "Облако", "number" => 29); ?>

Многомерный массив

Буквально пару слов про этого гиганта 🙂

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 "
  1. Номер строки $row"; echo "
      "; for ($col = 0; $col < 3; $col++) { echo "
    • ".$flowers[$row][$col]."
    • "; } echo "
    "; echo "
  2. "; } 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 "
  1. Номер строки $row"; echo "
      "; foreach($flowers[$row] as $key => $value) { echo "
    • ".$value."
    • "; } echo "
    "; echo "
  2. "; } 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 "

  • Номер слоя $layer"; echo "
      "; for ($row = 0; $row < 3; $row++) { echo "
    • Номер строки $row"; echo "
        "; for ($col = 0; $col < 3; $col++) { echo "
      • ".$flowers[$layer][$row][$col]."
      • "; } echo "
      "; echo "
    • "; } echo "
    "; echo "
  • "; } echo ""; ?>