Массивы в php

Ранее мы рассмотрели, как в переменные можно сохранить одиночное значение, например, одно число или одну строку. Но кроме того, мы можем сохранить в переменную набор значений. И для этого используются массивы.
Есть несколько способов определения массивов. Первый способ представляет использование функции array():

$numbers = array();

В данном случае определяется пустой массив $numbers.
Второй способ представляет использование квадратных скобок []:

$numbers = [];

При определении массива мы сразу можем передать ему начальные данные. Если применяются квадратные скобки, то элементы массива передаются внутри скобок:

$numbers = [1, 2, 3, 4];

Аналогичное определение массива с помощью функции array():

$numbers = array(1, 2, 3, 4);

В качестве элементов массива могут выступать объекты любого типа.
Для обращения к элементам массива применяются ключи. Ключ может представлять число или строку или одновременно и числа, и строки.
Для обычных массивов ключ представляет число. Числовые ключи еще называют индексами. Нумерация индексов начинается с нуля, то есть первый элемент массива имеет индекс 0, второй элемент - индекс 1 и так далее.
Например, обратимся к третьему элементу массива:

<?php
$numbers = [1, 4, 9, 16];
echo $numbers[2];   // 9
?>

Поскольку нумерация индексов начинается с нуля, то чтобы обратиться к третьему элементу, надо использовать индекс 2.
Таким образом мы получаем значение элемента массива. Но также мы можем его изменить:

<?php
$numbers = [1, 4, 9, 16];
$numbers[1] = 6;
echo $numbers[1];   // 6
?>

При этом нужно учитывать количество элементов массива. Так, мы не можем обратиться к элементу с несуществующим индексом:

<?php
$numbers = [1, 4, 9, 16];
echo $numbers[4];
?>

В данном случае в массиве $numbers всего 4 элемента, поэтому индексом последнего элемента будет 3. Таким образом, элемента с индексом 4 в массиве не существует, и при попытке получить его значение echo $numbers[4] PHP нам покажет предупреждение.
Тем не менее если мы хотим установить элемент по еще не существующему индексу, мы можем это сделать:

<?php
$numbers = [1, 4, 9, 16];
$numbers[5] = 76;
echo $numbers[5];
?>

Здесь устанавливается элемент с индексом 5. После установки мы можем получать его значение. При этом элемента с индексом 4 по прежнему не существует.
Для добавления нового элемента в массив мы можем, как в примере выше, просто установить новый элемент по еще не установленному индексу. Но есть и другой способ:

<?php
$numbers = [1, 4, 9, 16];
$numbers[] = 25;
echo $numbers[4];
?>

При таком способе новый элемент добавляется в конец массив, соответственно здесь, чтобы получить новый элемент, надо использовать индекс 4.
Чтобы получить полное наглядное представление о том, как в конкретном массиве сопоставляются ключи и значения элементов, можно использовать функцию print_r, в которую в качестве параметра передается массив:

<?php
$numbers = [1, 4, 9, 16];
$numbers[] = 25;
print_r($numbers);
?>

Вывод скрипта:

Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )

Также следует отметить, что необязательно как-то специально инициализровать переменную массива - мы можем по ходу добавлять элементы в массив:

<?php
$numbers[] = 20;
$numbers[] = 120;
$numbers[] = 720;
print_r($numbers); // Array ( [0] => 20 [1] => 120 [2] => 720 )
?>

Оператор =>

Оператор => позволяет сопоставить ключ с определенным значением. Хотя при определении массива выше нам не требовался подобный оператор, тем не менее мы можем его применять. Например, следующий массив:

$numbers = [1, 4, 9, 16];

Будет аналогичен следующему массиву:

$numbers = [0=>1, 1=>4, 2=>9, 3=>16];
// $numbers = array(0=>1, 1=>4, 2=>9, 3=>16);

Каждый элемент определяется в следующем формате: ключ => значение
В дальнейшем мы также можем обращаться к элементам этого массива.
Этот оператор может понадобится, если мы хотим переопределить порядок индексов. Так, по умолчанию нумеация индексов начинается с нуля и каждый следующий элемент имеет индекс предыдущего элемента + 1. Оператор => же позволяет определить свои индексы вручную для элементов, необязательно с нуля и необязательно по порядку:

$numbers = [1=> 1, 2=> 4, 5=> 25, 4=> 16];
echo $numbers[2];   // 4

Также мы можем задать индекс лишь для одного элемента, тогда для последующих элементов индекс автоматически будет увеличиваться на единиицу:

$numbers = [4=> 16, 25, 36, 49, 64];
print_r($numbers);

В данном случае индексация начинается с числа 4 - это индекс элемента 16. Тогда для элемента 25 индексом будет число 5 и так далее.
Результат:
Array ( [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 )

Перебор массива

Для перебора массива мы можем применять стандартный метод for:

<?php
$users = ["Tom", "Sam", "Bob", "Alice"];
$num = count($users);
for($i=0; $i < $num; $i++) {
    echo "$users[$i] <br>";
}
?>

В данном случае мы не определяем вручную индексы элементов, поэтому индексация начинается с нуля с увеличением на единиицу для последующего элемента. Поэтому мы можем в цикле через переменную $i передавать индекс, начиная с нуля. Единственная трудность может заключаться в том, как определить индекс конечного элемента, чтобы установить потолок для переменной $i. В этом случае мы можем с помощью встроенной функции count() получить длину массива. Эта функция в качестве параметра принимает массив и возвращает его длину.
Результат работы скрипта:
Tom
Sam
Bob
Alice

Цикл foreach

Тем не менее выше использованный способ перебора не поможет, если индексы определяются вручную и отличаются они от соседних индексов не на единицу, а на произвольную величину. В этом случае мы можем использовать специальный цикл - foreach:

<?php
$users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"];
$num = count($users);
foreach($users as $element) {
    echo "$element <br>";
}
?>

В цикле foreach из массива последовательно извлекаются все элементы, и их значение помещается в переменную, указанную после ключевого слова as. В данном случае в переменную $element по очереди помещаются все четыре значения из массива $users. Когда будет извлечен последний элемент из массива, цикл завершается.
В итоге мы получим тот же результат:
Tom
Sam
Bob
Alice
Цикл foreach позволяет извлекать не только значения, но и ключи элементов:

<?php
$users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"];
$num = count($users);
foreach($users as $key => $value) {
    echo "$key - $value <br>";
}
?>

Здесь при переборе элементов цикла в переменную $key будет передаваться ключ элемента, а в переменную $value - его значение.
Результат работы скрипта:
1 - Tom
4 - Sam
5 - Bob
21 - Alice

Ассоциативные массивы

Ассоциативные массивы представляют подвид массивов, в которых, в отличие от обычных массивов, в качестве ключа применяются строки.
При создании ассоциативного массива мы явным образом указываем ключ элемента, после которого идет оператор => и значение элемента. Например, создание ассоциативного массива с помощью функции array():

$words = array("red" => "красный", "blue" => "синий", "green" => "зеленый");

Здесь создается массив $words из трех элементов. Например, первый элемент имеет ключ "red", а значение - "красный".
Создание аналогичного массива с помощью квадратных скобок:

$words = ["red" => "красный", "blue" => "синий", "green" => "зеленый"];

Используя ключ, также как и в обычных массивах, можно обратиться к элементу массива, например, получить или изменить его значение:

<?php
$countries = ["Germany" => "Berlin", "France" => "Paris", "Spain" => "Madrid"];
echo $countries["Spain"];   // Madrid
echo "<br>";
$countries["Spain"] = "Barcelona";
echo $countries["Spain"];   // Barcelona
?>

Результат работы скрипта:
Madrid
Barcelona
Для добавления элемента с новым ключом в ассоциативный массив достаточно определить элемент с этим ключом:

$countries = ["Germany" => "Berlin", "France" => "Paris", "Spain" => "Madrid"];
$countries["Italy"] = "Rome";   // определяем новый элемент с ключом "Italy"
echo $countries["Italy"]; // Rome

Также необязательно инициализировать переменную массива при ее определении. Можно, как с обычными массивами, добавлять элементы по ходу:

<?php
$countries["Germany"] ="Berlin";
$countries["France"] ="Paris";
$countries["Spain"] ="Madrid";
$countries["Italy"] = "Rome";
echo $countries["Italy"]; // Rome
?>

Для перебора ассоциативного массива применяется цикл foreach:

<?php
$words = ["red" => "красный", "blue" => "синий", "green" => "зеленый"];
foreach($words as $english => $russian) {
    echo "$english : $russian <br>";
}
?>

Результат перебора массива:
red : красный
blue : синий
green : зеленый

Смешанные массивы

PHP позволяет использовать в одном массиве числовые и строковые индексы:

$data = [1=> "Tom", "id132" => "Sam", 56 => "Bob"];
echo $data[1];  // Tom
echo "<br>";
echo $data["id132"];    // Sam

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

В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в PHP массивы могут также быть многомерными, то есть такими, где элемент массива сам является массивом.
Например, создадим многомерный массив с помощью функции array():

$families = array(array("Tom", "Alice"), array("Bob", "Kate"));

Сокращенное определение:

$families = [["Tom", "Alice"], ["Bob", "Kate"]];

Выше определенный многомерный массив $families является двухмерным (частный случай многомерного массива), который можно представить в виде таблицы:
Tom
Alice
Bob
Kate
Для элементов данного массива не установлены явным образом ключи, поэтому каждый ключ элемента представляет числовой индекс, которые по умолчанию начинаются с нуля. Поэтому чтобы обратиться к первому элементу массива, надо использовать индекс 0 - $families[0]:

$families = [["Tom", "Alice"], ["Bob", "Kate"]];
print_r($families[0]);  // Array ( [0] => Tom [1] => Alice )

Но поскольку элементами массива $families являются вложенные массивы, то чтобы обратиться к элементам внутри этих вложенных массивов, нам необходимо использовать второй индекс - $families[0][0]:

$families = [["Tom", "Alice"], ["Bob", "Kate"]];
echo $families[0][0] . "<br>";  //Tom
echo $families[0][1] . "<br>";  //Alice
echo $families[1][0] . "<br>";  //Bob
echo $families[1][1];   //Kate

То есть выражение $families[0] представляет обращение к первому элементу массива $families - к вложенному массиву ["Tom", "Alice"], а выражение $families[0][0]представляет обращение к первому элементу вложенного массива, то есть, в данном случае к элементу "Tom".
Перебор многомерного массива:

<!DOCTYPE html>
<html>
<head>
<title>mirjs.uz</title>
<meta charset="utf-8" />
</head>
<body>
<table>
<?php
$families = [["Tom", "Alice"], ["Bob", "Kate"], ["Sam", "Mary"]];
foreach ($families as $family) {
    echo "<tr>";
    foreach ($family as $user) {
        echo "<td> $user </td>";
    }
    echo "</tr>";
}
?>
</table>
</body>
</html>

Для перебора применяется цикл foreach. Цикл проходит по всем элементам массива $families, передавая каждый элемент в переменную $family:

foreach ($families as $family)

Однако каждый элемент массива $families, который передается в переменную $family, сам является массивом. И чтобы получить элементы из вложенного массива, применяется вложенный цикл:

foreach ($family as $user)

В итоге при переборе циклом сформируется таблица.

Также можно определять многомерные ассоциативные массивы:

<?php
$phones = array(
        "apple"=> array("iPhone 12", "iPhone X", "iPhone 12 Pro") ,
        "samsumg"=>array("Samsung Galaxy S20", "Samsung Galaxy S20 Ultra"),
        "nokia" => array("Nokia 8.3", "Nokia 3.4"));
foreach ($phones as $brand => $items) {
    echo "<h3> $brand </h3>";
    echo "<ul>";
    foreach ($items as $key => $value) {
        echo "<li> $value </li>";
    }
    echo "</ul>";
}
?>

И при выводе мы получим 3 списка:

Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива - "apple", а ключ первого элемента в первом массиве - число 0 (так как мы явным образом не указали ключи):

echo $phones["apple"][0];

Подобным образом можно получить второй элемент третьего массива:

echo $phones["nokia"][1];

Допустим, вложенные массивы также представляют ассоциативные массивы:

<?php
$gadgets = array(
        "phones" => array("apple" => "iPhone 12",
                    "samsumg" => "Samsung S20",
                    "nokia" => "Nokia 8.3"),
        "tablets" => array("lenovo" => "Lenovo Yoga Smart Tab",
                        "samsung" => "Samsung Galaxy Tab S5",
                        "apple" => "Apple iPad Pro"));
foreach ($gadgets as $gadget => $items) {
    echo "<h3> $gadget </h3>";
    echo "<ul>";
    foreach ($items as $key => $value) {
        echo "<li> $key : $value </li>";
    }
    echo "</ul>";
}
?>

Получение и изменение элемента в этом массиве:

// присвоим одному из элементов другое значение
$gadgets["phones"]["nokia"] = "Nokia 9";
// выведем это значение
echo $gadgets["phones"]["nokia"];

Выше для инициализации массива применялась функция array(), но также можно использовать и сокращенный вариант с квадратными скобками:

$gadgets = [
        "phones" => ["apple" => "iPhone 12",
                    "samsumg" => "Samsung S20",
                    "nokia" => "Nokia 8.2"],
        "tablets" => ["lenovo" => "Lenovo Yoga Smart Tab",
                        "samsung" => "Samsung Galaxy Tab S5",
                        "apple" => "Apple iPad Pro"]
];

статья взята с сайта:

metanit.com

Обсуждение закрыто.